在switch语句的默认部分使用负数作为字符

本文关键字:字符 语句 switch 默认部 | 更新日期: 2023-09-27 18:22:48

我没有寻找任何特定的代码示例,但有人能解释一下为什么我不能在这个switch语句的末尾使用"-1"吗?它一直说char类型有"太多的文字"。(差不多)。我必须把它转换成另一种类型吗?

谢谢你的任何帮助,请解释一下,不要给出代码。我很想通过亲身经历来学习这一点:D

通过引用大写字母转换从ProcessInput()传递的7个字符
使用switch语句将字符转换为相应的数字(每个数字和每个有效大写字母的大小写语句)
**此部分的问题***为无效字母编写返回错误代码(-1)的默认情况
如果没有无效信件,返回0

    static void ToDigit(ref char digit)
    {
        digit = Char.ToUpper(digit);
        char result;
        switch (digit)
        {
            case '0':  result = '0';
                break;
            case '1': result = '1';
                break;
            case '2':
            case 'A':
            case 'B':
            case 'C': result = '2';
                break;
            case '3':
            case 'D':
            case 'E':
            case 'F': result = '3';
                break;
            case '4':
            case 'G':
            case 'H':
            case 'I': result = '4';
                break;
            case '5':
            case 'J':
            case 'K':
            case 'L': result = '5';
                break;
            case '6':
            case 'M':
            case 'N':
            case 'O': result = '6';
                break;
            case '7':
            case 'P':
            case 'Q':
            case 'R':
            case 'S': result = '7';
                break;
            case '8':
            case 'T':
            case 'U':
            case 'V': result = '8';
                break;
            case '9':
            case 'W':
            case 'X':
            case 'Y':
            case 'Z': result = '9';
                break;
                //Says I can't enter -1 as char "too many characters in character literal
            default: result = 'e';
                break;
        }
        digit = result;
    }

在switch语句的默认部分使用负数作为字符

顾名思义,char单个字符。所有"串在一起"的一组字符在C#中称为string

如果您想要整数值-1作为字符,那么您可以通过说unchecked((char)(-1))(*)来实现,但您应该意识到这是一个非常糟糕的想法。我想这是你的任务:

编写返回无效字母的错误代码(-1)的默认大小写。

C#中不是这样工作的;返回一个"坏"值表示失败是一种"最糟糕的做法"——这是1970年代风格C编程的特点,但不是C#。

在这里正确的做法是:(1)根本没有错误情况;如果没有大写形式,那么根本不转换字符,或者(2)如果输入不正确则抛出异常,或者(3)返回一个可为null的char,并为"坏"值返回null。

此外,您的程序采用ref而不是返回值这一事实也令人非常怀疑。ToDigit方法应该是计算并返回结果,而不是突变变量

我认为你正在学习的任何课程都是几十年前写的,最初针对的是完全不同的语言,从未更新为使用现代最佳实践。我会认真质疑这些材料的价值。


当将常量-1强制转换为类型T而不是(T)-1时,总是在C#中说(T)(-1)。如果你用后一种方式写,读者可能会混淆你的意思是"从T中减去一"还是"把负一加到T型"。

因为'-1'不是字符,所以它是两个独立的字符。'-'和"1"。

因为它谈到了在成功时返回0,所以我认为结果字符和返回值是不同的。所以他们可能想要这样的东西:

static int ToDigit(ref char digit)
{
  switch (Char.ToUpperInvariant(digit))
  {
    case x:
      digit=y;
      return 0;
    ...
    default:
      return -1;
   }
}

几个注意事项:

  1. 我使用的是ToUpperInvariant而不是ToUpper,因为toupper使用当前的区域设置,这可能会导致奇怪的效果。例如,您的代码在土耳其计算机上运行时不接受i
  2. 在出现错误的情况下,我将保持digit不变
  3. 使用int来表示成功/错误是个坏主意。至少应该是bool

您应该将结果设置为int类型,并将其返回给调用者。然后,调用者可以将其与-1进行比较,如果不是-1,则可以通过添加'0':快速转换回数字

int result;
switch (digit) {
    // Assign result here
}
char resDigit;
if (result < 0) {
    // bad digit
} else {
    resDigit = result + '0';
}

顺便说一句,你可以用一个长字符串中的查找来代替你的开关:

string lookup = "0    1    2 ABC3 DEF4 GHI5 JKL6 MNO7PQRS8 TUV9WXYZ";
int pos = lookup.IndexOf(char.ToUpper(digit));
if (pos < 0) {
    // bad digit
} else {
    result = '0' + pos/5;
}

一个char只能包含一个字符,因此'-1'不起作用。(char)(-1)不是有效的字符值。

我的建议是简单地使用'?'作为默认(或错误)值。