在处理可空类型时,理解它们在表达式中与其他数据类型的兼容性至关重要。一个常见的场景会导致意外错误,那就是将三元运算符与可空类型和非可空类型一起使用。
考虑以下代码片段:
<code class="language-c#">int? x = GetBoolValue() ? 10 : null;</code>
这里的目标是:如果 GetBoolValue()
返回 true
,则将值 10 赋给可空整数 x
;否则,x
保持为 null
。但是,编译器会标记一个错误:
<code>错误:无法确定条件表达式的类型,因为在 int 和 <null> 之间没有隐式转换。</code>
问题解读
此错误突出了三元表达式中类型不匹配的问题。左侧表达式 GetBoolValue()
返回一个 bool
值,解析为 true
或 false
。右侧表达式尝试组合两个表达式:
10
,这是一个 int
字面量(不是 int?
)。null
,这是一个空字面量。编译器首先尝试评估右侧表达式。它遇到 int
字面量 10
和空字面量 null
,它们是类型不兼容的。int
和 null
之间没有定义隐式转换,导致类型不兼容错误。
解决类型不匹配
为了解决这个问题,需要使右侧表达式与可空类型兼容。有几种方法:
将字面量强制转换为 int?
:
<code class="language-c#"> x = GetBoolValue() ? (int?)10 : null;</code>
使用空字面量或默认值:
<code class="language-c#"> x = GetBoolValue() ? 10 : (int?)null; x = GetBoolValue() ? 10 : default(int?);</code>
隐式转换
在已接受的答案中提到的隐式转换是:
int?
到 null
: 可空类型 int?
可以隐式转换为 null
。int
到 int?
: 非可空 int
可以隐式转换为可空 int?
。通过使右侧表达式与可空类型兼容,您可以解决类型不匹配问题,并根据 GetBoolValue()
的返回值分配适当的值。
以上是为什么'?10:null”在C#中失败的类型失败?的详细内容。更多信息请关注PHP中文网其他相关文章!