【问题标题】:Wierd ambiguious call on overloaded function with a function parameter [duplicate]带有函数参数的重载函数的奇怪模糊调用[重复]
【发布时间】:2013-09-26 23:24:21
【问题描述】:

所以说我有一个重载的方法。一个接受一个返回 uint 的函数,一个接受一个返回 int 的函数。

static void test1(Func<uint> f)
{
    //things
}
static void test1(Func<int> f)
{
    // also things
}

现在我试着这样称呼它:

test1(Random.FunctionThatReturnsUints);

但我在编译时得到一个模棱两可的调用错误:

   Error    4   The call is ambiguous between the following methods or
    properties: 'RNG_Comparison.Run.test1(System.Func<int>)' and 'RNG_Comparison.Run.test1
(System.Func<uint>)'

那是怎么回事?重载函数的全部意义不在于它基于类型隐含地理解您的意思吗?我的意思是,如果我用返回 BigInt 之类的 func 来调用它,也许我会看到编译器的困惑,但是这个看起来很简单。

有人知道我为什么会收到这个错误吗?

【问题讨论】:

  • 尝试test1(new Func&lt;uint&gt;(Random.FunctionThatReturnsUints)) 看看是否会导致不同的编译器错误。
  • @cdhowie,这将解决编译器错误。
  • 重载似乎没问题,请发布更多代码。
  • 查看 Eric Lippert 关于类似主题的回答 stackoverflow.com/a/2058854/961113

标签: c# function-pointers


【解决方案1】:

Tim 引用的post by Eric Lippert 中的重要内容是:

这里的原则是确定方法组可转换性需要使用重载决议从方法组中选择一个方法,而重载决议不考虑返回类型。

在您的代码中存在方法组转换,这会导致问题。 建议的解决方案消除了这个问题。

【讨论】:

  • 是的,我读过了,有趣的东西。我明白为什么会这样。谢谢
【解决方案2】:

Eric Lippert(C# 团队的成员)称this sort of thing“是规范中最棘手的部分之一”,所以要完整回答“为什么编译器会这样做?”这将是一个难题。可以说,这是因为 C# 规范允许这种情况发生。这是一个简单的解决方法:

test1(new Func<uint>(Random.FunctionThatReturnsUints));

【讨论】:

  • 感谢您的支持;我注意到我是 C# 语言设计和编译器开发团队的成员。
猜你喜欢
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 2017-04-24
  • 2020-05-11
相关资源
最近更新 更多