C# 为什么我的开关在有单引号的情况下工作?

C# 为什么我的开关在有单引号的情况下工作?,c#,C#,所以,免责声明,我对C#还是一个新手,我正在努力学习更精细的复杂性。我有一个我编写的课堂作业,它是有效的,但我不确定它为什么有效,我想理解它 这是代码,不是完整的代码,我只是删掉了相关部分: int studentType = 0; switch (studentType) { case 1: studentType = '1'; WriteLine("What is your GPA?");

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

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


谢谢你的帮助

有一个从
char
int
的隐式转换,常量
char
表达式可以用作常量
int
表达式,这就是您得到的。
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代码点。

@DarkBee:它真的没有-它问的是,当OP不希望switch语句工作时,为什么switch语句会工作。因为您混合使用引号和不使用引号,所以您正在经历
char
int
之间的隐式转换。因此,为什么一个有效而另一个无效可能与您尝试比较一个值以及该值最初是如何设置的有关。但您只向我们展示了比较代码。研究c#中的变量声明和类型string、char和int。此外,当它“不起作用”时,读取并理解编译器抛出的错误-在试图理解程序的错误时,它们将大有帮助。@PhilCooper:不会有任何编译时错误,只是意外的结果。@JonSkeet我天真地没有预料到-谢谢你的澄清!如果我理解正确的话:在第一个开关中,我错误地调用了studentType 1、2、3?我这样做的原因是代码的早期部分:WriteLine(“1.本科”);WriteLine(“2.毕业生”);WriteLine(“3.PHD”);书面形式(“4.非学位证书”);我在想我必须把选项放在switch语句中。但实际上它是在做的是将studentType变成一个字符,因为='1'?因此,我可以删除所有studentType='x',然后从第二个开关中删除“”。我说得对吗?@Synik:从根本上说,你应该决定是要
studentType
是一个值为1、2、3的整数,还是一个值为“1”、“2”、“3”的字符。。。或者更好的是,拥有本科、研究生、博士等价值观的enum。我自己会选择enum版本,尽早从用户输入执行转换。根据我的分配标准,“studentType”需要是一个整数。我还不确定enum是什么意思,但当我到达我的家用电脑时,我会取出'studentType='1',etc,并从第二个开关中删除单引号,然后进行测试。为了澄清,我完整的noob代码只是想说,在删除studentType='x'值,然后从第二个开关中删除单引号之后,它工作得很好。我现在明白了,第一个案例中的studentType是不必要的。谢谢你,先生!