为何使用三元运算符与if语句时返回类型会发生变化?
为什么三元运算符与if语句返回的类型不同?
先看两段看似等价的代码:
public static object Foo1() { int valTrue = 5; decimal valFalse = 10m; return true ? valTrue : valFalse; } public static object Foo2() { int valTrue = 5; decimal valFalse = 10m; if (true) return valTrue; else return valFalse; }
运行以下代码后输出结果不一致:
Console.WriteLine(Foo1().GetType().Name); // 输出 Decimal Console.WriteLine(Foo2().GetType().Name); // 输出 Int32
核心原因
这是C#编译器对两种语法的处理规则不同导致的:
- 三元运算符
?::要求两个分支的表达式必须能解析为同一个类型。编译器会自动寻找两个分支类型的公共兼容类型,这里int可以隐式转换为decimal,但decimal不能隐式转换为int,所以整个三元表达式的类型被确定为decimal。返回时是把转换后的decimal值装箱为object,因此GetType()返回Decimal。 - if语句:每个
return语句是独立执行的,直接将对应变量的原始类型装箱为object。因为条件恒为true,实际执行的是return valTrue;,也就是把int类型的5装箱,所以GetType()返回Int32。
关于Rider的简化建议
Rider的建议是从逻辑行为等价性出发(两种写法都返回valTrue的值),但没有考虑到C#对三元运算符的类型推断规则,导致编译后的实际类型行为出现差异。
内容的提问来源于stack exchange,提问作者Jan Zahradník
相关产品推荐
相关产品推荐

