使用函数参数对重载函数进行模棱两可的调用

本文关键字:函数 模棱两可 调用 重载 参数 | 更新日期: 2023-09-27 18:32:59

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

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 来调用它,也许我可以看到编译器的混乱,但这个似乎很干脆。

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

使用函数参数对重载函数进行模棱两可的调用

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

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

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

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

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