2010-10-03 87 views
5

从.NET 1.0开始,Convert类就已经存在。自此以后,接口也一直存在。为什么Convert.ChangeType需要一个对象参数?

Convert.ChangeType方法作品上实现IConvertible(事实上,除非我错了,全部由Convert类提供的转换方法都是这样)类型的对象。那么为什么参数类型为object

换句话说,而不是这样的:

public object ChangeType(object value, Type conversionType); 

为什么签名是不是这个?

public object ChangeType(IConvertible value, Type conversionType); 

对我来说这似乎很奇怪。

回答

5

展望反射,你可以看到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; 
} 
+0

我想这似乎是唯一可能的解释......不,这不是很奇怪么,虽然,设计师会考虑行为“可以采取对象并将其转换为相同类型”,甚至值得支持?我的意思是,这将用于什么? – 2010-10-05 13:16:07

+0

@丹 - 我认为ObjectDatasource在内部使用IIRC,我猜他们更喜欢内部检查而不是外部检查?我同意这看起来不太有用。 – 2010-10-05 13:21:49

相关问题