C# 3.0 オブジェクト初期化子コンストラクターのオプションのかっこ
C# 3.0 では、オブジェクト初期化子構文を使用してオブジェクトを初期化するときに、コンストラクターにパラメーターがない場合はコンストラクターを囲むかっこを省略できます。これは、型名の後の中括弧がオブジェクトの初期化子の始まりを示しているためです。
設計上の考慮事項
括弧をオプションにする決定は、次のようないくつかの要因によって決まりました。
曖昧さの考慮
オプションの括弧は、オブジェクト初期化子のコンテキストでは問題を引き起こしませんが、オブジェクト初期化子のないデフォルトのコンストラクター呼び出しに適用すると、あいまいさが生じる可能性があります。次のコードを考えてみましょう:
<code class="language-c#">class P { class B { public class M { } } class C : B { new public void M(){} } static void Main() { new C().M(); // 1 new C.M(); // 2 } }</code>
行 1 は、新しい C オブジェクトを作成し、インスタンス メソッド M を呼び出します。行 2 では、新しい B.M オブジェクトを作成し、そのコンストラクターを呼び出します。 2 行目の括弧がオプションの場合、 C.M が C のコンストラクターを参照しているのか、 B にネストされたクラス M を参照しているのかが不明瞭になるため、プログラムは曖昧になります。
ヒューリスティックベースの曖昧さ回避
潜在的な曖昧さを解決するために、コンパイラーはヒューリスティックを使用してコードの意図を判断します。たとえば、ドット識別子と同じ名前の型、フィールド、またはメソッドが存在する場合、ドット識別子はそのメンバーを参照しているとみなされます。ただし、特に複雑なコードでは、使用されるヒューリスティックが常に期待どおりの解釈につながるとは限りません。
以上がC# 3.0 オブジェクト初期化子でかっこが省略可能なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。