You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:22:17