好吧,这个问题似乎很奇怪.确实是.
但是我坚信,此类黑客有助于理解语言和.net平台.
C#编译器对待可空类型的方式暗示了这个问题.
可空T是一个结构.但是编译器不装该结构,而是装它的值或只是空引用.
在装箱的Nullable情况下,这也很有趣.
Nullable<int> myInt = boxedStruct as Nullable<int>;
在这里,我认为boxedStruct不是盒装int,而是整个结构.
好吧,可能是因为在CLR级别上对Nullable的处理方式有所不同,因为我无法理解下面程序的输出.
class Program
{
public static bool? Property { get; set; }
static void Main(string[] args)
{
Property = true;
var valueType = typeof (Program).GetProperty("Property").GetValue(null).GetType();
var propType = typeof (Program).GetProperty("Property").PropertyType;
Console.WriteLine("Value's type '{0}' is the same as type of the property '{1}' - '{2}'", valueType, propType, valueType == propType);
Console.ReadKey();
}
}
输出:
Value’s type ‘System.Boolean’ is the same as type of the property
‘System.Nullable`1[System.Boolean]’ – ‘False’
更新:
以下是什么规格(ECMA 335)说:
I.8.2.4 Boxing and unboxing of values
…
If the value type
is a nullable type—defined as an instantiation of the value type
System.Nullable—the result is a null reference or bitwise copy of
its Value property of type T, depending on its HasValue property
(false and true, respectively).
因此,如果我正确理解这一点.可空T无法在.Net Framework中安装strcut,并且不仅在C#编译器中是不可能的,在CLR中也是如此.
解决方法:
我推测您要提出的问题是:
Can you box a
Nullable<int>
value without producing a null reference or a boxed int value, but instead an actually boxedNullable<int>
?
没有.