【问题标题】:Ambiguity between method overloads with string and EventHandler parameters带有字符串和 EventHandler 参数的方法重载之间的歧义
【发布时间】:2011-01-12 15:28:07
【问题描述】:

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

void Register(object source, EventHandler mapped_handler)
void Register(object source, string mapped_property)

我正在尝试这样称呼第一个:

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

Visual Studio 2008 给了我error CS1503: Argument '2': cannot convert from 'System.EventHandler' to 'string'

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

【问题讨论】:

  • 这应该可以。尽可能多地剥离仍然重现问题的代码(一个包含这两个具有琐碎定义的重载的类,以及一个尝试调用Register(object, EventHandler) 重载的Main)并将其发布在这里,我们会看到我们的可以做。同样,您尝试做的事情是可能的。

标签: c# overloading


【解决方案1】:

那应该没问题。简短但完整的示例:

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。您确定错误是在调用线路上吗?

【讨论】:

  • C# 版本之间的重载分辨率会有所不同吗?
  • @Anthony Pegram:不。这在 .NET 3.5 和 Visual Studio 2008 中绝对是可能的。
  • @Anthony:我已经尝试过使用“Visual C# 2008”编译器以及最近的编译器。诚然,它是 SP1,但我不希望它在这里有所作为。没有从 lambda 表达式到字符串的转换,因此该方法不应成为候选集的一部分。
  • @Jason 和 Jon,是的,刚刚也检验了这个假设。
【解决方案2】:

你需要做的:

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

【讨论】:

  • 你有什么解释原因吗?
  • Jason 是对的——你不应该这样做。我怀疑这个问题比我们被告知的要多。
  • 啊,不知道你有没有这样的东西? private void Register(Object o, EventHandler h) { ... } private void Register(Object o, EventHandler h) { ... } 在这种情况下,推断将是模棱两可的...
  • @Chris Shain:不,根本不是这样。有一些我们没有被提供的信息导致了问题。
  • @Chris:在这种情况下,这将是一组与给定签名完全不同的签名。它也无法解释为什么错误消息中提到了“字符串”。
【解决方案3】:

感谢所有回复...原来这是我的方法声明中的一个问题。我的方法签名中第一个参数的类型指定错误。我会把这个问题留给像我这样犯愚蠢错误的人。

【讨论】:

  • 当您遇到编译问题时,请尽可能多地剥离重现该问题的代码。如果您无法重现问题,那么您在某处犯了错误,希望剥离有助于找到它(这就是她所说的)。
  • @Jason 这正是我发现问题的方式。感谢您的建议。
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
相关资源
最近更新 更多