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