有人可以解释一下为什么会发生这种情况,以后又如何避免这种情况。
我有两个这样的功能:
public static int Result(int x, int y)
{
return x * y;
}
public static int Result(int x, char Anything)
{
if(Anything.Equals('M'))
return x * x;
else
return x;
}
int r = Result(2, 2); // Returns 4
int r1 = Result(2, 'T'); // Returns 2
int r2 = Result(2, 'M'); // Returns 4
如您所见,方法的名称相同但参数不同,并显示超出预期的结果。
让我麻烦的是我将public static int Result(int x, char Anything)
更改为public static int Result(int x, char[] Anything)
原因造成我的问题是,由于某种原因,复杂的函数在编译并尝试使用它后一直返回错误。几个小时后,我发现这种变化给我带来了问题。
由于我将方法改为采用char[]
而不是char
,因此Visual Studio
告诉我cannot convert char to char[]
是符合逻辑的,因为我还有其他获得{{1 }},并且我通过了int, int
,但没有返回错误。
我猜这是因为每个int, char
都有它的数值,而且当我更改其他函数时,编译器去查看其他具有相同名称的方法并找到了一个与char
相同的方法,但是他可以从int, int
转换为char
,因此不会给我错误。
我的副问题是,我猜对了吗? 我的主要问题是如何防止这种情况的发生。我曾经使用过该功能大约50次,其中有20次需要更改,而不是弹出错误并仅选择它,我必须转到50次中的每一个,看看自己是否需要更改。
答案 0 :(得分:2)
感觉您的设计有缺陷,或者至少是您的方法名称,但这可能只是过分简化了。解决方案是使用params
选项。它仍然将一个字符与int, char[]
签名相匹配。
public static int Result(int x, params char[] Anything)
{
if (Anything.Contains('M'))
return x * x;
else
return x;
}
答案 1 :(得分:1)
在这里您无能为力。是的,发生这种情况是因为隐式转换。
要尽早发现这些错误,您可以在单元测试中获得良好的代码覆盖率。看到某些测试失败,并且发现不再使用char[]
的方法会导致您很快地解决问题,而不是经过数小时的调试才能发现问题。