C# オブジェクト初期化子コンストラクターのオプションの括弧: 理由と曖昧さ回避
C# 3.0 では、パラメーターなしのコンストラクターが存在する場合、オブジェクト初期化コンストラクターでかっこを省略できます。この機能は次の要素に基づいて追加されました:
デフォルトのコンストラクター呼び出しに括弧がありません
ただし、オブジェクト初期化子のないオブジェクト作成式では、デフォルトのコンストラクター呼び出しのかっこが依然として必要です。この制限は、曖昧さを避けるためのものです。たとえば、次のコードでは:
<code class="language-csharp">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 のインスタンスを作成し、そのデフォルトのコンストラクターをトリガーします。 1 行目の括弧がオプションの場合、2 行目は C.M. を参照している可能性があるためあいまいになります。
曖昧な検出方法
C# 関数のあいまいさを判断するには、いくつかの方法が必要です。
潜在的な曖昧さの例
新しい接頭辞演算子「frob」の追加を検討してください:
<code class="language-csharp">x = frob 123 + 456;</code>
これは、123 456 の結果に対して frob 演算を実行するか、または x という名前の frob 型の変数に 10 を代入すると解釈できます。
別の例では、C# 2.0 の次の式があいまいです:
<code class="language-csharp">yield(x);</code>
イテレーターで x を生成することを意味することも、x をパラメーターとして使用して yield メソッドを呼び出すことを意味することもできます。この曖昧さは、「yield return(x)」に変更することで解消されます。
以上が一部の C# オブジェクト初期化子ではかっこが省略可能ですが、他のものでは必須なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。