C#Polymorphysm:重载函数,接受委托Action <t>和Func <t,r>?</t,r> </t>

时间:2011-02-10 12:19:29

标签: c# oop c#-4.0 polymorphism

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

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

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

两个

static void Action(XDocument x)

static string Function(XDocument x)

具有相同的方法签名。

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

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

Invoker(new Action<XDocument>(Action));
Invoker(new Func<XDocument, String>(Function));

解决歧义。

答案 1 :(得分:4)

你可以这样调用你的方法:

public static void Main(string[] args)
 {
     Invoker(new Action<XDocument>(Action));
     Invoker(new Func<XDocument, string> (Function));
}

简单地说,你必须告诉编译器你想要调用什么方法。

答案 2 :(得分:3)

使用linq稍微更优雅的解决方案:

 public static void Main(string[] args)
 {
     Invoker((xdocument)=>doSomething);      // calls action invoker
     Invoker((xdocument)=>{return doSomething;}); // calls function invoker
}

最后......归结为签名。