Почему Convert.ChangeType принимает параметр объекта? - PullRequest
7 голосов
/ 03 октября 2010

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

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

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

public object ChangeType(object value, Type conversionType);

Почему подпись не такая?

public object ChangeType(IConvertible value, Type conversionType);

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

1 Ответ

7 голосов
/ 03 октября 2010

Глядя в отражатель, вы можете увидеть верхнюю часть 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, но уже равен тип назначения просто вернет исходный объект.

Конечно, похоже, что это only исключение для значения, необходимого для реализации 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;
}
...