所以说我有一个方法,我已经超载了。一个函数返回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或其他东西的函数来调用它,也许我可以看到编译器的混乱,但是这个看起来很混乱。
有谁知道我为什么会收到这个错误?
答案 0 :(得分:1)
Eric Lippert(C#团队成员)称this sort of thing是“规范中最毛茸茸的部分之一”,所以要完全回答“为什么编译器会这样做?”这将是一个难题。可以这么说,这是因为C#规范允许这种情况发生。这是一个简单的解决方法:
test1(new Func<uint>(Random.FunctionThatReturnsUints));
答案 1 :(得分:1)
Tim引用的post by Eric Lippert中重要的是:
这里的原则是确定方法组可转换性需要使用重载决策从方法组中选择方法,而重载决策不考虑返回类型。
在您的代码中,方法组转换正在运行并导致问题。 建议的解决方案消除了这个问题。