使用(int)Course.SubGroup??0触发CS0019错误的原因及写法弊端
报错原因
C# 中的??是空合并运算符,仅支持左操作数为可空值类型/引用类型的场景:仅当左操作数为null时,才会返回右操作数的结果,否则直接返回左操作数本身。
你的代码中,(int)强转运算符的优先级高于??运算符,所以(int)Course.SubGroup??0的实际执行顺序是:
- 先将
Course.SubGroup强制转换为普通int类型 - 再尝试对转换后的普通
int和0应用??运算符
而普通int是值类型,天生不可能为null,完全不满足??运算符的使用要求,因此编译器抛出CS0019错误,提示无法对两个int类型的操作数使用??运算符。
修复方案
- 若
Course.SubGroup本身就是int?(可空int)类型,调整优先级即可:
该写法会先判断(int)(Course.SubGroup ?? 0)Course.SubGroup是否为null,为null则取0,再统一转为int类型。 - 你也可以用可空类型内置方法简化写法,可读性更高:
Course.SubGroup.GetValueOrDefault(0)
原写法的弊端
- 运算符优先级逻辑错误,直接导致编译不通过
- 即使后续调整了优先级,如果
Course.SubGroup的实际类型和int不兼容,强转操作还可能触发运行时类型转换异常 - 写法可读性差,维护者很难第一时间判断你要先做转换还是先做空判断
内容的提问来源于stack exchange,提问作者zari
相关产品推荐
相关产品推荐

