这是一个简单的代码,在这里我尝试实现某种多态性。
您可以看到重载的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(!)错误,我无法解释。他们来了:
错误1下列方法或属性之间的调用是模棱两可的:'ConsoleApplication3.Program.Invoker(System.Action)'和'ConsoleApplication3.Program.Invoker(System.Func)'c:\ users \ i.smagin \ documents \ visual studio 2010 \ Projects \ ConsoleApplication3 \ ConsoleApplication3 \ Program.cs 21 4 ConsoleApplication3
错误2下列方法或属性之间的调用是模棱两可的:'ConsoleApplication3.Program.Invoker(System.Action)'和'ConsoleApplication3.Program.Invoker(System.Func)'c:\ users \ i.smagin \ documents \ visual studio 2010 \ Projects \ ConsoleApplication3 \ ConsoleApplication3 \ Program.cs 22 4 ConsoleApplication3
错误3'字符串ConsoleApplication3.Program.Function(System.Xml.Linq.XDocument)'具有错误的返回类型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));
解决歧义。