سؤال

ال 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top