使用函数参数对重载函数进行模棱两可的调用
本文关键字:函数 模棱两可 调用 重载 参数 | 更新日期: 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));