为什么Convert.ChangeType采用对象参数?

时间:2010-10-03 00:03:09

标签: .net iconvertible changetype

自.NET 1.0以来,Convert类已经存在。此时IConvertible界面也存在。

Convert.ChangeType方法适用于实现IConvertible的类型的对象(事实上,除非我弄错了,否则所有 Convert类提供的转换方法就是这样的。那么为什么参数类型为object

换句话说,而不是:

public object ChangeType(object value, Type conversionType);

为什么不签名?

public object ChangeType(IConvertible value, Type conversionType);

我觉得很奇怪。

1 个答案:

答案 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;
}