为什么我的开关在有单引号时有用?

时间:2018-01-24 09:59:52

标签: 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命令完全正常。我意外做的最初是把案例'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是一个整数,所以第一个开关没有单引号是有意义的,但是这个开关如何需要单引号?

我想我可以按原样提交,只要它正常工作,但我主要想了解最新情况。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

charint的隐式转换,常量char表达式可以用作常量int表达式,这就是你和#39;得到了。 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代码点。