【问题标题】:Optional null coalescence in if clause [duplicate]if 子句中的可选空合并 [重复]
【发布时间】:2019-02-13 09:20:11
【问题描述】:

我的一位同事刚刚遇到了一个有趣的问题。我用下面的简单示例代码重新创建了这个问题。问题是编译器抱怨i在第三行使用时可能没有被赋值。

我知道GetProperty 不会被执行,如果onull,那么i 将不会被初始化,但在这种情况下我也不会评估int i2 = i;。是否有一些关于选项或空合并操作符的东西我不知道这与这里相关,或者这只是编译器不够聪明的情况,无法知道i 如果未初始化则不使用?

void Test(object o) {
    if (o?.GetProperty("Blah", out int i) ?? false) {
        int i2 = i;
    }
}

【问题讨论】:

  • 我认为编译器并不是那么“聪明”。不能断定“空传播程序路径”object o = null; if(o?.GetProperty("Blah", out int i) ..会被if语句的?? false部分捕获
  • @Piflik 你可以从参数中分离出变量并在那里初始化。

标签: c#


【解决方案1】:

您将 Null Conditional Accesso? 一起使用,这意味着(只要 o 为空)GetProperty 可能不会被调用。

这引入了未初始化的i 的可能性。因为在o 为空的情况下不会调用out int i

可以通过删除空条件访问来测试代码

void Test(SomeClass o) {
    if (o.GetProperty("Blah", out int i) ?? false) {
        int i2 = i; //no-compiler error 
    }
}

在上述方法中,GetProperty 方法总是被调用,因此i 总是被初始化和赋值。


另一方面,您的代码无法编译,object o 本身没有 .GetProperty 方法


if (o?.GetProperty("Blah", out int i) ?? false)

可以扩展为

if (o != null)
{
     if (o.GetProperty("Blah", out int i))
     {
     }
}
else
{
     //i is not defined in this context //
}

【讨论】:

  • @John 我认为这个答案没有任何价值。它只是陈述了一个 OP 已经知道的事实(如问题中所述)。
  • 那么你期待什么?我正在描述编译器的行为方式。您对此有什么其他建议吗?如上所述,该错误是预期的和合乎逻辑的
  • @Simonare 也许添加了为什么编译器不知道如果 o 为 NULL 并因此 i 未初始化,则不会执行 if 语句的“真实”路径这一事实。或者这些线之间的东西。我也没有很好的答案。
  • @croxy 你能检查我编辑的答案吗?
  • @Simonare 在您的扩展代码示例中,else 块不使用 i,因此应该没有编译器错误。
猜你喜欢
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多