2012-01-30 26 views
4

我只是想知道Convert類和IConvertible接口如何與DataRow一起工作。如果我有這樣的代碼:IConvertible接口如何與DataRow一起使用?

string s="25"; 
int x= Convert.ToInt32(s); 

Convert.ToInt32(s)呼叫將運行以下命令:

((IConvertible)s).ToInt32() 

那麼,這如何工作,像這樣的一行代碼:

Convert.ToInt32(myDataRow["intField"]); 

當DataRow和對象都不能實現IConvertible?

+0

調用的方法不會神奇地轉換成調用另一個方法。你調用的方法可能會調用另一種方法,但這是不同的。 – svick 2012-01-30 14:26:34

回答

7

該領域的DataRow暴露爲對象,所以調用,以Convert.ToInt32(object value),正是你在你的問題說這確實:

return value == null? 0: ((IConvertible)value).ToInt32(null); 

運行時嘗試執行轉換,從objectIConvertibleobject沒有實現接口沒關係;重要的是,運行時的DataRow中的任何實際的具體類型都必須實現該接口。例如,所有內置的CLR基本類型都實現IConvertible,因此它將調用String.ToInt32()Boolean.ToInt32()或其他任何內容。這些接口是明確實現的,所以你不能直接在你自己的stringbool上調用這些方法,但是你可以將它們轉發到IConvertible並做到這一點。

object s = new System.String('1', 3); 
var i = Convert.ToInt32(s); 

// s = "111"; i = 111 

如果您嘗試運行對象上的方法,該方法沒有實現IConvertible,你會得到一個運行時類型轉換異常:

var o = new object(); 
var x2 = Convert.ToInt32(o); 

// throws System.InvalidCastException: "Unable to cast object of type 'System.Object' to type 'System.IConvertible'." 
相關問題