Activator.CreateInstance创建T类型的值而不是Nullable <t>

时间:2015-05-29 16:25:37

标签: c# activator

查看下面的示例代码

returnValue

出于某种原因,bool变量的类型为bool?,而不是self.scrollView.contentSize。为什么会这样,怎么可以避免?

UPD:这是我VS的截图 enter image description here

1 个答案:

答案 0 :(得分:15)

在这种特殊情况下,您使用的CreateInstance重载会返回objectNullable<T>struct,因此需要将object表示为需要装箱的Nullable<T>。然而,null实际上不能被CLR的规则包装。而是使用基础值或bool。这就是为什么你在这里得到一个原始的bool?而不是System.Boolean

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

修改

在确定值的类型是否可为空时,似乎存在一些混淆。特别要指出的是,以下打印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] 值的实际类型的最安全方法是使用泛型执行以下操作:

{{1}}