查看下面的示例代码
returnValue
出于某种原因,bool
变量的类型为bool?
,而不是self.scrollView.contentSize
。为什么会这样,怎么可以避免?
UPD:这是我VS的截图
答案 0 :(得分:15)
在这种特殊情况下,您使用的CreateInstance
重载会返回object
。 Nullable<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}}