3

さて、質問は奇妙に思えるかもしれません。そして、それは本当にです。
それでも私は、このようなハックが言語と .net プラットフォームを理解するのに役立つと強く信じています。

C# コンパイラが null 許容型を処理する方法は、この質問を意味します。

Nullable<T>構造体です。ただし、コンパイラはこの構造体ではなく、それが保持する値または単に null 参照をボックス化します。

ボックス化された 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();
    }
}

出力:

値の型 'System.Boolean' は、プロパティ 'System.Nullable`1[System.Boolean]' - 'False' の型と同じです

アップデート:

ここで、仕様 (ECMA 335) は次のように述べています。

I.8.2.4 値のボックス化とボックス化解除
...
値型が null 許容型 (値型 System.Nullable のインスタンス化として定義されている) である場合、結果は null 参照または T 型の Value プロパティのビットごとのコピーになります。 、その HasValue プロパティに応じて (それぞれ false および true)。

だから私がこれを正しく理解していれば。Nullable<T>strcut は .Net Framework でボックス化できず、C# コンパイラだけでなく CLR でも不可能です。

4

2 に答える 2

3

あなたが尋ねようとしている質問は次のとおりであると推測しています。

Nullable<int>null 参照またはボックス化された int 値を生成せずに、実際にボックス化された値をボックス化できますNullable<int>か?

いいえ。

于 2013-09-27T16:10:26.240 に答える