这是一个简单的代码,我尝试在其中实现某种多态性。
可以看到重载Invoker
函数,接受 Func<T,R>
和 Action<T>
作为论据。
编译器说它不能被编译,因为如果 Invoker 方法不明确:
class Program
{
static void Invoker(Action<XDocument> parser)
{
}
static void Invoker(Func<XDocument,string> parser)
{
}
static void Main(string[] args)
{
Invoker(Action);
Invoker(Function);
}
static void Action(XDocument x)
{
}
static string Function(XDocument x)
{
return "";
}
}
我收到 3(!) 个错误,我无法解释其中任何一个。他们在这里:
Error 1 The call is ambiguous between the following methods or properties: 'ConsoleApplication3.Program.Invoker(System.Action)' and 'ConsoleApplication3.Program.Invoker(System.Func)' c:\users\i.smagin\documents\visual studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs 21 4 ConsoleApplication3
Error 2 The call is ambiguous between the following methods or properties: 'ConsoleApplication3.Program.Invoker(System.Action)' and 'ConsoleApplication3.Program.Invoker(System.Func)' c:\users\i.smagin\documents\visual studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs 22 4 ConsoleApplication3
Error 3 'string ConsoleApplication3.Program.Function(System.Xml.Linq.XDocument)' has the wrong return type c:\users\i.smagin\documents\visual studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs 22 12 ConsoleApplication3
有什么想法吗?
最佳答案
两者
static void Action(XDocument x)
和
static string Function(XDocument x)
具有相同的方法签名。
返回值不是方法签名的一部分。因此,仅具有不同的返回类型是行不通的。它们必须具有不同数量的参数或参数类型必须不同。
因为编译器无法确定要使用哪一个(采用Action
的方法或采用Func
的方法),所以您必须明确指定它:
Invoker(new Action<XDocument>(Action));
Invoker(new Func<XDocument, String>(Function));
解决歧义。
关于C# Polymorphysm : overloading function, 接受委托(delegate) Action<T> 和 Func<T,R>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4956980/