c# - 为什么我的 switch 在有单引号时起作用?

标签 c#

所以免责声明,我是 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 是一个整数,所以第一个开关没有单引号是有意义的,但是开关怎么需要单引号呢?

我想我可以按原样提交,只要它能正常工作,但我主要想了解发生了什么。

感谢您的帮助!

最佳答案

存在从charint的隐式转换,常量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/

相关文章:

c# - 使用强名称签署 dll 的好处

c# - 来自 png 图像的 GetPixel() 中的 RGB 值错误

c# - 错误 : The Name Assert Does Not Exist In The Current Context

c# - 如何链接到一个区域的根目录?

c# - 后台线程 C#

c# - 从 C# 启动 Excel 进入后台

c# - 捕获 PropertyInfo.setvalue 抛出的 setter 异常

c# - Xaml:在 DataTemplate 中绑定(bind)集合

c# - 在 C# 中使用 interop.word 将 word 文档中的表格居中

c# - 文化(语言)发生变化时的动态字体大小