Почему convert.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;
}