【问题标题】:using null-coalescing operator inside if statement (C#)在 if 语句中使用空合并运算符(C#)
【发布时间】:2018-10-09 01:30:28
【问题描述】:

我知道如果左操作数不为 null,则 null 合并运算符返回左操作数,但我没有看到有人在 if 语句中使用它,例如:

if (car.IsSold ?? false)
 ...

我猜这意味着如果 car.IsSold 不为空,则继续执行 if 语句,否则跳出语句。那正确吗?如果是,为什么程序员不应该使用

if (car.IsSold)
...

哪个做完全相同的事情? 如果有人为我解决这个问题,我将不胜感激。

【问题讨论】:

  • “IsSold”是否可以为空?
  • 如果您想知道两者有何不同,请尝试两者,看看会发生什么。
  • @Masood:如果IsSoldbool?,那么这将是编译代码所必需的。 if 条件必须解析为 bool
  • @Masood 你能解释一下为什么如果你想知道他们是否做了同样的事情,你不只是尝试一下吗?我很好奇....这是一段微不足道的代码,应该很容易测试出来看看会发生什么。
  • 您可以轻松启动控制台应用程序,或使用 Linqpad 之类的工具来执行一些 C# 代码并查看它的作用。不应将 Stack Overflow 用作实际尝试研究正在发生的事情的替代品。

标签: c#


【解决方案1】:

假设car.IsSold 可以为空:

if (car.IsSold)

甚至无法编译,因为 bool? 不会隐式转换为 bool


显式演员表

 if ((bool)car.IsSold)

如果car.IsSoldnull 将抛出异常


使用空合并运算符

if (car.IsSold ?? false)

在这种情况下可以工作,以及其他解决方案。

【讨论】:

  • 或者直接使用car.IsSold.GetValueOrDefault(),如果IsSold为空,则返回false
  • @SebastianHofmann 在这种情况下,我发现空合并运算符的可读性更高,但这只是个人喜好。
  • @SebastianHofmann 实际上我认为 ??版本更好,输入更少,并且明确给出默认值
  • @da_berni 是的,我也更喜欢 ?? 运算符,我只是添加了一个选项。
【解决方案2】:

哪个做同样的事情?

不,它没有。因为bool?(或Nullable<bool>)和bool 不是完全相同的东西。

if 条件必须解析为bool。但是 bool? 可能 在运行时解析为 null。所以编译器不允许这样做。如果有问题的值为null,您必须在条件中提供仍将返回bool 的逻辑。可能最简单的方法是空合并运算符和默认文字。

【讨论】:

  • 编译器不允许的原因不是 bc 它可能会解析为 null .. 它是 bc 没有隐式转换
  • @Adrian:两种说法,真的。编译器试图将条件解释为bool,因为这是它所需要的。如果结果是bool,则满足必要性。如果不是,编译器会尝试从条件解析到的任何内容中查找隐式强制转换。最终它需要成为bool
  • 不,您在争辩说它不允许它可能解析为空。如果你明确地转换为 bool 它仍然可能,但它会编译
  • @Adrian:这将导致运行时错误而不是编译时错误,编译器专门要避免这种错误。但它在语义上仍然与我所描述的相同。显式转换解析为bool(至少就编译器而言,因为实际上是开发人员告诉编译器“别担心,我保证它会是bool”),这这是if 的要求。显式转换可能在运行时失败,但这是一个不同的问题。我们都说同样的话,我们都是对的,我们只是在描述它与 OP 不同。
猜你喜欢
  • 2019-03-27
  • 1970-01-01
  • 2014-09-23
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多