ホームページ > バックエンド開発 > C++ > デリゲートのオーバーロードでメソッド グループの構文があいまいな呼び出しエラーを引き起こすのはなぜですか?

デリゲートのオーバーロードでメソッド グループの構文があいまいな呼び出しエラーを引き起こすのはなぜですか?

Linda Hamilton
リリース: 2025-01-13 10:10:43
オリジナル
794 人が閲覧しました

Why Method Group Syntax Causes Ambiguous Invocation Errors (C# Delegate Overloads)

C# メソッド グループ構文とデリゲートのオーバーロードによって引き起こされるあいまいな呼び出しエラー

シナリオ:

2 つのオーバーロードを持つ関数を呼び出すとします。1 つは Action デリゲートを受け入れ、もう 1 つは Func デリゲートを受け入れます。匿名メソッド (ラムダ式) の代わりにメソッド グループ構文を使用することを好みます。

質問:

メソッド グループ構文を使用してこれらのオーバーロードを呼び出そうとすると、コンパイラ あいまいな呼び出し エラーが発生します。

説明:

このあいまいさの理由は、メソッド グループとデリゲート型の暗黙的な変換ルールにあります。 C# 仕様によれば、メソッド グループは互換性のあるデリゲート型に暗黙的に変換できます。ただし、この文脈における「互換性」とは、メソッド グループとデリゲートの型の互換性ではなく、メソッドとデリゲートのの互換性を指します。

指定された例では、メソッド グループ classWithSimpleMethods.GetString は両方のデリゲート オーバーロードの有効な候補です: classWithDelegateMethods.Method(Action)classWithDelegateMethods.Method(Func<string>)。どの変換が優れているかを決定するための明確な型規則がないため、コンパイラはあいまいな呼び出しエラーを生成します。

解決策:

このあいまいさを解決するには、次のように、対応するデリゲート型への明示的なキャストを提供します。

<code class="language-csharp">classWithDelegateMethods.Method((Action)classWithSimpleMethods.DoNothing);
classWithDelegateMethods.Method((Func<string>)classWithSimpleMethods.GetString);</code>
ログイン後にコピー

C# 7.3 アップデート:

C# 7.3 以降では、メソッド グループ構文を使用するときにあいまいな呼び出しエラーが発生しなくなります。オーバーロード候補の順序付けが改善されたことにより、コンパイラはコンテキストに基づいて予期されるデリゲート型を正しく推測できるようになりました。

以上がデリゲートのオーバーロードでメソッド グループの構文があいまいな呼び出しエラーを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート