自.NET 1.0以来,Convert
类已经存在。此时IConvertible
界面也存在。
Convert.ChangeType
方法仅适用于实现IConvertible
的类型的对象(事实上,除非我弄错了,否则所有 Convert
类提供的转换方法就是这样的。那么为什么参数类型为object
?
换句话说,而不是:
public object ChangeType(object value, Type conversionType);
为什么不签名?
public object ChangeType(IConvertible value, Type conversionType);
我觉得很奇怪。
答案 0 :(得分:7)
查看反射器,您可以看到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;
}