我有一种情况,我想使用方法组语法而不是匿名方法(或lambda语法)来调用函数。
该函数有两个重载,一个接受一个Action
,其他的需要Func<string>
。
我可以使用匿名方法(或lambda语法)愉快地调用这两个重载,但是如果我使用方法组语法,则会出现歧义调用的编译器错误。我可以通过显式强制转换为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更新
<LangVersion>7.3</LangVersion>
由于使用了改进的重载候选,因此如果使用C#7.3()或更高版本,示例代码将可以编译。