関数の呼び出しに匿名メソッド(またはラムダ構文)ではなくメソッドグループ構文を使用するシナリオがあります。
関数は、2つのオーバーロード、取るものを持ってAction
、他はかかりますFunc<string>
。
匿名メソッド(またはラムダ構文)を使用して2つのオーバーロードを喜んで呼び出すことができますが、メソッドグループ構文を使用すると、あいまいな呼び出しのコンパイラエラーが発生します。Action
またはFunc<string>
に明示的にキャストすることで回避できますが、これは必要ないと思います。
明示的なキャストが必要な理由を誰かが説明できますか?
以下のコードサンプル。
class Program
{
static void Main(string[] args)
{
ClassWithSimpleMethods classWithSimpleMethods = new ClassWithSimpleMethods();
ClassWithDelegateMethods classWithDelegateMethods = new ClassWithDelegateMethods();
// These both compile (lambda syntax)
classWithDelegateMethods.Method(() => classWithSimpleMethods.GetString());
classWithDelegateMethods.Method(() => classWithSimpleMethods.DoNothing());
// These also compile (method group with explicit cast)
classWithDelegateMethods.Method((Func<string>)classWithSimpleMethods.GetString);
classWithDelegateMethods.Method((Action)classWithSimpleMethods.DoNothing);
// These both error with "Ambiguous invocation" (method group)
classWithDelegateMethods.Method(classWithSimpleMethods.GetString);
classWithDelegateMethods.Method(classWithSimpleMethods.DoNothing);
}
}
class ClassWithDelegateMethods
{
public void Method(Func<string> func) { /* do something */ }
public void Method(Action action) { /* do something */ }
}
class ClassWithSimpleMethods
{
public string GetString() { return ""; }
public void DoNothing() { }
}
C#7.3アップデート
あたりとして0xcdeさんにC#7.3の感謝のように2019年3月20日に以下のコメント(私はこの質問を投稿9年後!)、このコードのコンパイルの改善過負荷候補。