2017-09-08 39 views
0

Nullable類是怎麼做到的?如何「定製」類型的名稱,如可空?

public class Foo<T> 
{ 
    public T Bar { get; set; } 
} 

var n1 = new Nullable<int>(123).GetType().Name; // "Int32" 
var n2 = new Foo<int>().GetType().Name; // "Foo`1" 

是否有可能使Foo具有相同的類型名稱,即「Int32」?

+5

請注意'Nullable'在運行時得到了一些非常特殊的處理。特別是,如果一個沒有值的'Nullable'被裝箱,盒裝對象就是'null' - 與其他任何值類型不同。我的懷疑是這是類似的特殊待遇。 – cdhowie

+0

另請參見[ValueType如何。GetType()能夠確定結構的類型?](https://stackoverflow.com/q/926352/1207195)。因爲'Nullable '是一個'ValueType',並且值類型被裝箱,所以它就是你得到的(參見[Nullable.cs](https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/nullable) .cs)源代碼) –

+0

答案是我的評論和@ AdrianoRepetti的組合。我將起草一個答案。 – cdhowie

回答

2

tl; dr:不,您不能更改Foo的名稱。你看到的Nullable是如何計算可空值的副作用。


有在玩幾件事引起有關Nullable輸入您看到的行爲:

  • 調用上的值類型.GetType()導致值爲boxed
  • Nullable運動員在拳擊方面獲得特殊待遇。 Nullable本身從不盒裝,代替:
    • 如果Nullable包含一個值,該值是盒裝(所述int值123在這種情況下)。
    • 如果Nullable不包含值,則裝箱操作評估爲null

結果是,在你的代碼,Object.GetType()是看到盒裝int值在執行時,盒裝Nullable<int>對象(因爲,再一次,這是不可能的)。這就是爲什麼可以爲空的名稱與其內容的名稱相同的原因。這是爲了證明發生了什麼最簡單的方法:

new Nullable<int>(123).GetType() == typeof(int) 
new Nullable<int>(123).GetType() != typeof(Nullable<int>) 

作爲一個側面說明,因爲沒有一個值箱爲空,it's an error一個可空到空爲空的調用.GetType()!這同時有意義(它是空的,對嗎?)並沒有意義(這是一種值類型...它不能真的爲空!)。當可爲空的沒有價值,你可以調用方法實施或撤消了對Nullable本身(因爲這些調用不需要拳擊),但你不能援引Object繼承並沒有覆蓋方法。

Nullable有一個奇怪的雙重性格,有時它會導致這樣的驚喜。

現在我們知道Nullable案件發生了什麼,我們可以看到Nullable實際上並沒有重命名 - 您看到的類型的名稱是可以爲空的裝箱行爲的結果。

相關問題