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」?
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」?
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
實際上並沒有重命名 - 您看到的類型的名稱是可以爲空的裝箱行爲的結果。
請注意'Nullable'在運行時得到了一些非常特殊的處理。特別是,如果一個沒有值的'Nullable'被裝箱,盒裝對象就是'null' - 與其他任何值類型不同。我的懷疑是這是類似的特殊待遇。 – cdhowie
另請參見[ValueType如何。GetType()能夠確定結構的類型?](https://stackoverflow.com/q/926352/1207195)。因爲'Nullable'是一個'ValueType',並且值類型被裝箱,所以它就是你得到的(參見[Nullable.cs](https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/nullable) .cs)源代碼) –
答案是我的評論和@ AdrianoRepetti的組合。我將起草一個答案。 – cdhowie