2014-11-24 66 views
3

.Net Framework基本類型,如Int32,Int64,Boolean等。實現IConvertible接口,但這些類型的元數據不包含IConvertible接口中定義的方法(如ToByte,ToBoolean等)的實現。爲什麼.Net Framework基本類型不包含IConvertible方法的實現?

我想了解爲什麼基類型沒有方法實現,即使它們實現了IConvertible接口。任何人都可以請幫忙嗎?

+1

明確的接口實現方法需要找到BindingFlags.NonPublic。他們是私人的。 – 2014-11-24 00:31:23

+0

「這些類型的元數據不包含...」是非常奇怪的說法,特別是沒有提及您使用的工具/您嘗試過的代碼。假設你已經閱讀[System.Int32](http://msdn.microsoft.com/en-us/library/system.int32(v = vs.110).aspx)文檔更好(也可能是重複)的問題應該是「如何在'Int32'的顯式實現的接口上獲取元數據,我的代碼......不顯示任何方法」。 – 2014-11-24 00:36:34

回答

7

仔細查看documentation - Int32 implements IConvertibleexplicitly

當一個類/結構調用這些方法

var asConvertable = (IConvertible) 3; //boxing 
var someByte = asConvertible.ToByte(); 
+0

謝謝dcastro指出Int32明確實現了IConvertible。我現在明白了。謝謝。 – Raji 2014-11-25 12:30:30

+0

這是一個救星,同時構建了一個針對netstandard和framework的netstandard庫。顯然它在netstandard版本中是明確的,但不在框架中(或者說我的編譯器)。 – gregsdennis 2017-06-26 08:06:17

2

Int32和其他原始類型實現IConvertible接口explicitly之前實現一個接口明確,你要投那個類型,其接口的實例。顯式接口實現意味着該方法不會出現在具體的類型公共方法中:您不能直接調用它,您需要先轉換到接口。

int x = 42; 
IConvertible c = (IConvertible)x; 
byte b = c.ToByte(); 

要明確實現的接口,不指定可進入等級,以及你與接口名稱前綴的方法名:

byte IConvertible.ToByte() 
{ 
    ... 
} 

要訪問與反射的方法,你必須包括接口的全稱:

MethodInfo toByte = 
    typeof(int).GetMethod("System.IConvertible.ToByte", 
          BindingFlags.Instance | BindingFlags.NonPublic); 
+0

感謝Thomas的詳細解釋。 – Raji 2014-11-25 12:31:45

相關問題