7

该类Convert自 .NET 1.0 以来一直存在。从那时起,该IConvertible界面也已存在。

Convert.ChangeType方法适用于实现类型的对象IConvertible(其实除非我记错了,该类提供的所有转换方法Convert都是这种方式)。那么为什么是参数类型object呢?

换句话说,而不是这样:

public object ChangeType(object value, Type conversionType);

为什么不是这个签名?

public object ChangeType(IConvertible value, Type conversionType);

对我来说似乎很奇怪。

4

1 回答 1

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;
}
于 2010-10-03T00:22:47.077 回答