[英]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.