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?
。为什么会这样?如何避免?
UPD:这是我的 VS 的截图
在这种特殊情况下,您正在使用 CreateInstance
的重载,其中 returns object
。 Nullable<T>
是一个 struct
,因此要表示为 object
,它需要装箱。然而 Nullable<T>
实际上不能被 CLR 规则限制。而是使用基础值或 null
。这就是为什么你在这里得到原始 bool
而不是 bool?
。
文档:https://msdn.microsoft.com/en-us/library/ms228597.aspx
编辑
在确定值的类型是否可为 null 方面似乎存在一些混淆。特别指出的是,以下打印 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]
看下面的示例代码
var genericNullableType = typeof(Nullable<>);
var nullableType = genericNullableType.MakeGenericType(typeof(bool));
var returnValue = Activator.CreateInstance(nullableType, (object)false);
出于某种原因 returnValue
变量的类型将是 bool
而不是 bool?
。为什么会这样?如何避免?
UPD:这是我的 VS 的截图
在这种特殊情况下,您正在使用 CreateInstance
的重载,其中 returns object
。 Nullable<T>
是一个 struct
,因此要表示为 object
,它需要装箱。然而 Nullable<T>
实际上不能被 CLR 规则限制。而是使用基础值或 null
。这就是为什么你在这里得到原始 bool
而不是 bool?
。
文档:https://msdn.microsoft.com/en-us/library/ms228597.aspx
编辑
在确定值的类型是否可为 null 方面似乎存在一些混淆。特别指出的是,以下打印 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]