C# 带有字符串和EventHandler参数的方法重载之间的歧义

C# 带有字符串和EventHandler参数的方法重载之间的歧义,c#,overloading,C#,Overloading,我在使用重载方法时遇到了一些困难。我的签名如下: void Register(object source, EventHandler mapped_handler) void Register(object source, string mapped_property) Register(someObject, (s, e) => { ... }); 我试着这样称呼第一个: void Register(object source, EventHandler mapped_handler

我在使用重载方法时遇到了一些困难。我的签名如下:

void Register(object source, EventHandler mapped_handler)
void Register(object source, string mapped_property)
Register(someObject, (s, e) => { ... });
我试着这样称呼第一个:

void Register(object source, EventHandler mapped_handler)
void Register(object source, string mapped_property)
Register(someObject, (s, e) => { ... });
Visual Studio 2008给了我
错误CS1503:参数“2”:无法从“System.EventHandler”转换为“string”

我错过了什么?我不确定问题出在哪里。我还有其他非重载方法,可以毫无问题地将
EventHandler
lambdas传递给它们。

您需要执行以下操作:

Register(someObject, new EventHandler((s,e)=>{...}));

那应该很好。简短但完整的示例:

using System;

public class Test
{
    static void Main(string[] args)
    {
        object o = new object();
        Register(o, (s, e) => {});
    }

    static void Register(object source, EventHandler handler)
    {
        Console.WriteLine("Handler");
    }

    static void Register(object source, string text)
    {
        Console.WriteLine("Text");
    }
}
如果你能用一个同样简短但完整的例子来更新你的问题,但这个例子不起作用,我们可能会进一步提供帮助。(我的猜测是,在给出一个简短但完整的示例的过程中,您会发现问题所在。)


错误消息明确谈论
EventHandler
这一事实有点可疑-因为参数的类型不是
EventHandler
,它只是一个lambda表达式,可以转换为
EventHandler
。您确定电话线上有错误吗?

谢谢您的回复。。。结果发现这是我的方法声明中的一个问题。我的方法签名中第一个参数的类型指定错误。我将把这个问题留给像我这样犯愚蠢错误的人来回答。

你有什么解释吗?杰森是对的,你不需要这样做。我想,这个问题比我们被告知的要复杂得多。啊,我想知道你是否有类似的事情?private void Register(对象o,EventHandler h){…}private void Register(对象o,EventHandler h){…}在这种情况下,推断将是不明确的…@Chris Shain:不,根本不是这样。有一些我们没有得到的信息导致了这个问题。@Chris:如果是这样的话,那将是一组与给出的签名完全不同的签名。它也不能解释为什么在错误消息中提到“string”。这应该是可行的。尽可能地去除仍然会重现问题的代码(一个包含这两个重载的类,定义很简单,一个
Main
试图调用
寄存器(对象,事件处理程序)
重载),并将其发布到这里,我们将看到我们可以做些什么。再说一次,你想做的是可能的。这可能是C版本之间在重载分辨率上的差异吗?@Anthony Pegram:不。这在.NET3.5和VisualStudio2008中是绝对可能的。@Anthony:我已经用“Visual C#2008”编译器以及最近的一个编译器尝试过了。诚然,这是SP1,但我不认为这会有什么不同。没有从lambda表达式到字符串的转换,因此该方法不应该是候选集的一部分。@Jason和Jon,是的,也只是测试了该假设。当您遇到编译问题时,请尽可能去除代码,以重现该问题。如果你不能重现这个问题,你在某个地方犯了一个错误,希望脱衣舞能帮助你找到它(她就是这么说的)。@Jason我就是这样发现这个问题的。谢谢你的建议。