C#Polymorphysm:重载函数,接受委托Action <T>和Func <T,R>?

Ily*_*gin 3 c# oop polymorphism c#-4.0

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

您可以看到重载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 "";
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到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

有任何想法吗?

dec*_*one 6

static void Action(XDocument x)
Run Code Online (Sandbox Code Playgroud)

static string Function(XDocument x)
Run Code Online (Sandbox Code Playgroud)

有相同的方法签名.

返回值不是方法签名的一部分.因此,只有不同的返回类型将无法正常工作.它们必须具有不同数量的参数或参数类型必须不同.

因为,编译器无法确定使用哪一个(采用的方法Action或采用的方法Func),您必须明确指定它:

Invoker(new Action<XDocument>(Action));
Invoker(new Func<XDocument, String>(Function));
Run Code Online (Sandbox Code Playgroud)

解决歧义.