是否有可能欺骗C#编译器以将Nullable结构蚂蚁而不是其值装箱?

好吧,这个问题似乎很奇怪.确实是.
但是我坚信,此类黑客有助于理解语言和.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 boxed Nullable<int>?

没有.

上一篇:[转载]再谈百度:KPI、无人机,以及一个必须给父母看的案例


下一篇:camshift 目标跟踪