首页 >后端开发 >C++ >为什么'?10:null”在C#中失败的类型失败?

为什么'?10:null”在C#中失败的类型失败?

Susan Sarandon
Susan Sarandon原创
2025-01-28 22:10:10948浏览

Why Does

三元运算符与可空类型:解开“?10:null”的谜团

在处理可空类型时,理解它们在表达式中与其他数据类型的兼容性至关重要。一个常见的场景会导致意外错误,那就是将三元运算符与可空类型和非可空类型一起使用。

考虑以下代码片段:

<code class="language-c#">int? x = GetBoolValue() ? 10 : null;</code>

这里的目标是:如果 GetBoolValue() 返回 true,则将值 10 赋给可空整数 x;否则,x 保持为 null。但是,编译器会标记一个错误:

<code>错误:无法确定条件表达式的类型,因为在 int 和 <null> 之间没有隐式转换。</code>

问题解读

此错误突出了三元表达式中类型不匹配的问题。左侧表达式 GetBoolValue() 返回一个 bool 值,解析为 truefalse。右侧表达式尝试组合两个表达式:

  • 10,这是一个 int 字面量(不是 int?)。
  • null,这是一个空字面量。

编译器首先尝试评估右侧表达式。它遇到 int 字面量 10 和空字面量 null,它们是类型不兼容的。intnull 之间没有定义隐式转换,导致类型不兼容错误。

解决类型不匹配

为了解决这个问题,需要使右侧表达式与可空类型兼容。有几种方法:

  • 将字面量强制转换为 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
  • intint? 非可空 int 可以隐式转换为可空 int?

通过使右侧表达式与可空类型兼容,您可以解决类型不匹配问题,并根据 GetBoolValue() 的返回值分配适当的值。

以上是为什么'?10:null”在C#中失败的类型失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn