2010-10-03 89 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

相關問題