該領域的DataRow暴露爲對象,所以調用,以Convert.ToInt32(object value)
,正是你在你的問題說這確實:
return value == null? 0: ((IConvertible)value).ToInt32(null);
運行時嘗試執行轉換,從object
到IConvertible
。 object
沒有實現接口沒關係;重要的是,運行時的DataRow
中的任何實際的具體類型都必須實現該接口。例如,所有內置的CLR基本類型都實現IConvertible
,因此它將調用String.ToInt32()
或Boolean.ToInt32()
或其他任何內容。這些接口是明確實現的,所以你不能直接在你自己的string
或bool
上調用這些方法,但是你可以將它們轉發到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'."
調用的方法不會神奇地轉換成調用另一個方法。你調用的方法可能會調用另一種方法,但這是不同的。 – svick 2012-01-30 14:26:34