将char传递为int

时间:2018-10-09 13:27:52

标签: c#

有人可以解释一下为什么会发生这种情况,以后又如何避免这种情况。

我有两个这样的功能:

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次中的每一个,看看自己是否需要更改。

2 个答案:

答案 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[]的方法会导致您很快地解决问题,而不是经过数小时的调试才能发现问题。