为何C#中int类型变量的switch语句单引号case可生效?
问题解析:为什么第二个switch需要单引号case?
嘿,这个问题的核心其实是C#中不同类型赋值和比较时的隐式转换,咱们一步步拆解清楚:
首先看你的变量定义:int studentType = 0; —— 你把它声明成了int(整数)类型,这是关键前提。
第一个switch的逻辑:
你最初用无引号的数字case 1:、case 2:能正常工作,是因为此时studentType的初始值是整数0,进入switch时是用整数和整数做比较,匹配逻辑完全没问题。
但这里藏了一个容易忽略的细节:在每个case里,你给studentType赋值的是字符常量,比如:
case 1: studentType = '1'; ... break;
'1'是char类型的值,当你把它赋值给int变量时,C#会自动把它转换成对应的ASCII码值——字符'1'的ASCII码是49,同理'2'是50,'3'是51。也就是说,执行完第一个switch后,studentType的值已经不是你以为的1、2、3,而是49、50、51了!
第二个switch的逻辑:
当你用无引号的case 1:时,你是在拿整数1和studentType当前的49做比较,显然不相等,所以不会执行对应的代码块;而当你改成case '1':时,C#会把字符'1'转换成它的ASCII码49,这就和studentType的当前值49完全匹配了,所以代码就能正常输出GPA了。
怎么修正这个逻辑不一致的问题?
有两种更规范的写法,选一种就行:
- 统一用整数类型:把第一个switch里的赋值改成整数,比如
studentType = 1;(去掉单引号),这样第二个switch用case 1:就能正常匹配,逻辑更清晰。// 第一个switch修改后 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同理 } - 把变量改成char类型:如果一开始就把
studentType声明为char,那么所有case都用带单引号的字符常量,避免类型转换带来的混淆:char studentType = '0'; // 第一个switch用case '1':、case '2': // 第二个switch也保持case '1':、case '2':,逻辑统一
内容的提问来源于stack exchange,提问作者Synik
相关产品推荐
相关产品推荐

