这是一个简单的代码,在这里我尝试实现某种多态性。

您可以看到重载的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));


解决歧义。

10-05 23:27