3

所以说我有一个我已经重载的方法。一个接受一个返回 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 来调用它,也许我会看到编译器的困惑,但这个看起来很简单。

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

4

2 回答 2

1

Tim 引用的Eric Lippert的帖子中的重要内容是:

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

在您的代码中,有方法组转换在起作用,这会导致问题。建议的解决方案消除了该问题。

于 2013-09-26T15:24:21.580 回答
1

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

test1(new Func<uint>(Random.FunctionThatReturnsUints));
于 2013-09-26T15:16:54.823 回答