4

C#コンパイラが次の割り当てをどのように処理するかを誰かが知っているかどうか疑問に思っていました:

int? myInt = null;

私の仮定では、暗黙的な変換が実行されていると思いますが、null リテラルの割り当てがどのように処理されるかわかりません。System.Nullable オブジェクトを逆アセンブルしたところ、暗黙の演算子がこれにオーバーライドされていることがわかりました。

public static implicit operator T?(T value)  {
    return new T?(value);  
}

これが呼び出されると、2 次コンストラクターを起動しようとします。

public Nullable(T value) {
    this.value = value;
    this.hasValue = true; 
}

これが私の混乱の出番です... this.value は何らかの値型であり、null にすることはできません。

それで、この「魔法」がどのように行われるかを知っている人はいますか...または、セカンダリコンストラクターが呼び出されると仮定するのは間違っていますか? コンパイラは、2 番目のコンストラクターの署名を null リテラルと一致させることができないことを知っているため、既定のコンストラクターが呼び出されますか (その結果、myInt が新しい「null」Nullable に割り当てられます)。

4

5 に答える 5

-2

C# は、 IL にコンパイルされる高水準言語です。

null 許容型の導入により、C# 標準が変更されたため、C# コンパイラの動作を変更して、「Nullable 以外の構造体には null の値を割り当てることができない」などの新しいルールを処理する必要がありました。

null を構造体に代入することは一般的に許可されていませんが、これは IL を生成するときにコンパイラが強制するルールにすぎません。コンパイラはすべてのコードを解析し、それが何を意味するかを判断するため、あらゆる種類の規則を認識できます。例外と思われる規則も認識できます。

基本的に、コンパイラが C# コードを解析し、null を構造体に代入していることを検出すると、エラーが出力されます。構造体にnull を割り当てていることがわかった場合はNullable<T>、それを処理する方法を認識し、適切な IL を生成します。

C# 標準から:

13.7.1 Null 型変換: 「null 型 (§11.2.7) から任意の null 許容型への暗黙的な変換が存在します。この変換により、指定された null 許容型の null 値 (§12.2) が生成されます。」

12.2デフォルト値: 「null 許容型のデフォルト値は、HasValue プロパティが false であるインスタンスです。null 許容型のデフォルト値の Value プロパティを参照すると、System.InvalidOperationException 型の例外が発生します。デフォルト値もnull 許容型の null 値として知られています。null 型 (§11.2.7) から任意の null 許容型への暗黙的な変換が存在し、この変換によってその型の null 値が生成されます。

于 2009-04-19T19:12:23.793 に答える