簡體   English   中英

Activator.CreateInstance創建類型T的值,而不是Nullable <T>

[英]Activator.CreateInstance creates value of type T instead of Nullable<T>

查看下面的示例代碼

var genericNullableType = typeof(Nullable<>);
var nullableType = genericNullableType.MakeGenericType(typeof(bool));
var returnValue = Activator.CreateInstance(nullableType, (object)false);

由於某種原因, returnValue變量將是bool類型,而不是bool?類型bool? 為什么會這樣,又如何避免呢?

UPD:這是我的VS的屏幕截圖 在此處輸入圖片說明

在這種情況下,您將使用CreateInstance的重載,該重載返回object Nullable<T>是一個struct因此要表示為需要裝箱的object 但是Nullable<T>實際上不能被CLR規則裝箱。 而是使用基礎值或null 這就是為什么您將bool而不是bool重新帶回這里的原因bool?

文檔: https : //msdn.microsoft.com/en-us/library/ms228597.aspx

編輯

確定值的類型是否可為空似乎有些困惑。 特別要指出的是,以下顯示的是System.Boolean而不是System.Nullable``1[System.Boolean]

var x = (bool?)true;
Console.WriteLine(x.GetType());

此代碼也是拳擊的犧牲品。 GetType的調用具有隱式裝箱操作,因為它是對object的虛擬方法的調用,而不是對Nullable<T>的方法的調用:

IL_0009: ldloc.0
IL_000a: box valuetype [mscorlib]System.Nullable`1<bool>
IL_000f: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
IL_0014: call void [mscorlib]System.Console::WriteLine(object)

打印出var值的實際類型的最安全方法是對泛型執行以下操作:

static void PrintType<T>(T value)
{
    Console.WriteLine(typeof(T));
}

PrintType(x);  // Prints System.Nullable`1[System.Boolean]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM