Почему Convert.ChangeType принимает параметр объекта?

Convert Класс существует с.NET 1.0. IConvertible Интерфейс также существует с этого времени.

Convert.ChangeType Метод работает только на объектах типов, которые реализуют IConvertible (на самом деле, если я не ошибаюсь, все методы преобразования, предоставляемые Convert класс это так). Так почему же тип параметра object?

Другими словами, вместо этого:

public object ChangeType(object value, Type conversionType);

Почему это не подпись?

public object ChangeType(IConvertible value, Type conversionType);

Просто кажется мне странным.

1 ответ

Решение

Глядя в отражатель, вы можете увидеть верхнюю часть 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;
}
Другие вопросы по тегам