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

StackOverflow https://stackoverflow.com/questions/3847997

  •  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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top