さて、質問は奇妙に思えるかもしれません。そして、それは本当にです。
それでも私は、このようなハックが言語と .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 でも不可能です。