所以免责声明,我是 C# 的新手,正在尝试学习更复杂的知识。我有一个我编码的类作业并且它有效,但我不确定它为什么有效,并且想了解它。
这是代码,它不是完整的代码,我只是删掉了相关部分:
int studentType = 0;
switch (studentType)
{
case 1:
studentType = '1';
WriteLine("What is your GPA?");
gpa = Convert.ToDouble(ReadLine());
break;
case 2:
studentType = '2';
WriteLine("What is the title of your thesis?");
thesis = ReadLine();
break;
case 3:
studentType = '3';
WriteLine("What is the title of your dissertation?");
dissertation = ReadLine();
break;
case 4:
break;
default:
WriteLine("Invalid option input.");
break;
}//Switch for student Type
如前所述,case 命令像这样工作得非常好。我不小心做了一开始就放了 case 'x': ,但最终没有用,所以我删除了所有的单引号。
这是第二部分,为什么我感到困惑:
switch (studentType)
{
case '1':
case '4':
WriteLine($"GPA: {gpa:f2}");
break;
case '3':
WriteLine($"Dissertation title: {dissertation}");
break;
case '2':
WriteLine($"Thesis title: {thesis}");
break;
}//end of studentType switch
所以最初我尝试在不使用单引号的情况下编写案例,但每次运行 1 时,GPA 都不会填充,所以我尝试放入单引号,并且它有效,但我不确定为什么。
因为 studentType 是一个整数,所以第一个开关没有单引号是有意义的,但是开关怎么需要单引号呢?
我想我可以按原样提交,只要它能正常工作,但我主要想了解发生了什么。
感谢您的帮助!
最佳答案
存在从char
到int
的隐式转换,常量char
表达式可以作为常量int
expression,这就是你所拥有的。 int
的值是与 char
关联的 UTF-16 代码单元。
这是另一个例子:
const int X = 'x';
这也是您的赋值语句起作用的原因:
studentType = '1';
所以这样:
int value = ...;
switch (value)
{
case '1':
// ...
break;
}
相当于:
int value = ...;
switch (value)
{
case 49:
// ...
break;
}
...因为 49 是与字符“1”关联的 UTF-16 代码点。
关于c# - 为什么我的 switch 在有单引号时起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48419549/