لماذا يتم تحويل. changetype معلمة كائن؟
-
27-09-2019 - |
سؤال
ال Convert
لقد كان الطبقة موجودة منذ .NET 1.0. ال IConvertible
واجهت الواجهة أيضًا منذ هذا الوقت.
ال Convert.ChangeType
طريقة فقط يعمل على كائنات الأنواع التي تنفذ IConvertible
(في الواقع ، ما لم أكن مخطئًا ، الكل من طرق التحويل التي توفرها Convert
الفصل بهذه الطريقة). فلماذا نوع المعلمة object
?
بمعنى آخر ، بدلاً من هذا:
public object ChangeType(object value, Type conversionType);
لماذا ليس التوقيع هذا؟
public object ChangeType(IConvertible value, Type conversionType);
فقط يبدو غريبا بالنسبة لي.
المحلول
تبحث في عاكس يمكنك رؤية الجزء العلوي من ChangeType(object, Type, IFormatProvider)
, ، وهو ما يسمى تحت الأغطية:
public static object ChangeType(object value, Type conversionType, IFormatProvider provider)
{
//a few null checks...
IConvertible convertible = value as IConvertible;
if (convertible == null)
{
if (value.GetType() != conversionType)
{
throw new InvalidCastException(Environment.GetResourceString("InvalidCast_IConvertible"));
}
return value;
}
لذلك يبدو وكأنه كائن من النوع لا ينفذ IConvertible
لكن بالفعل هو سيعود نوع الوجهة فقط الكائن الأصلي.
منحت يبدو أن هذا هو فقط استثناء من القيمة التي تحتاج إلى تنفيذها IConvertible
, ، لكنه استثناء ، ويبدو أنه سبب وجود المعلمة object
في حين أن.
إليك اختبار LINQPAD السريع لهذه الحالة:
void Main()
{
var t = new Test();
var u = Convert.ChangeType(t, typeof(Test));
(u is IConvertible).Dump(); //false, for demonstration only
u.Dump(); //dump of a value Test object
}
public class Test {
public string Bob;
}