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 objectNullable<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]