在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;
}
顾名思义,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;
}
}
几个注意事项:
- 我使用的是
ToUpperInvariant
而不是ToUpper
,因为toupper使用当前的区域设置,这可能会导致奇怪的效果。例如,您的代码在土耳其计算机上运行时不接受i
- 在出现错误的情况下,我将保持
digit
不变 - 使用
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)
不是有效的字符值。
我的建议是简单地使用'?'
作为默认(或错误)值。