C#中的三元运算符与可空类型:限制详解
在处理可空值类型时,三元运算符 (? :) 可能会产生意想不到的行为。一个常见问题是尝试使用三元运算符将整型字面量或 null 赋值给可空整型变量。
例如,考虑以下代码:
<code class="language-csharp">int? x = GetBoolValue() ? 10 : null;</code>
这段代码中,三元运算符尝试计算右侧表达式:
<code class="language-csharp">GetBoolValue() ? 10 : null</code>
其中,GetBoolValue()
返回一个布尔值,10 是一个整型字面量,null 是一个空引用。编译器尝试隐式转换这些值以匹配左侧表达式的类型,即 int?
。
然而,整型字面量(不可空)和可空整型(int?
)之间没有隐式转换。同样,null 和整型之间也没有隐式转换。这导致编译器错误:
<code>无法确定条件表达式的类型,因为整型和<null>之间没有隐式转换。</code>
为了解决这个问题,必须修改右侧表达式,确保三元运算符的两个分支都返回与左侧表达式兼容的值。这可以通过隐式转换或显式转换来实现:
<code class="language-csharp">// 隐式转换(整型字面量到 int?) int? x = GetBoolValue() ? (int?)10 : null; // 显式转换(null 到 int?) int? x = GetBoolValue() ? 10 : (int?)null; // int? 的默认值(将 null 转换为 default(int?)) int? x = GetBoolValue() ? 10 : default(int?);</code>
通过这些修改,编译器可以成功计算右侧表达式并确定条件表达式的类型,从而消除错误。
以上是为什么三元运算符在C#中以无效的类型失败?的详细内容。更多信息请关注PHP中文网其他相关文章!