【问题标题】:Inline variable declaration doesn't compile when using '== false' instead of negation operator使用 '== false' 而不是否定运算符时,内联变量声明无法编译
【发布时间】:2018-03-27 23:28:46
【问题描述】:

考虑以下 sn-ps:

void Foo(object sender, EventArgs e)
{
    if (!(sender is ComboBox comboBox)) return;
    comboBox.DropDownWidth = 100;
}

相比

void Bar(object sender, EventArgs e)
{
    if ((sender is ComboBox comboBox) == false) return;
    comboBox.DropDownWidth = 100;
}

包含Foo() 的代码在.Net 4.6.1 中成功编译,而包含Bar() 的代码导致Use of unassigned local variable 'comboBox'

如果不对使用 == false 而不是否定运算符的原因进行辩论,有人可以解释为什么一个编译而另一个不编译吗?

【问题讨论】:

  • 旁注。它与框架无关。相反,它是一种与 .net 框架版本无关的语言功能。
  • @spender C# 7 模式匹配。
  • 这对我来说确实是个错误,我很想在Github repo 上提出问题。
  • 对于类似的问题,请查看this question and answer。不过不太一样。
  • 根据docs.microsoft.com/en-us/dotnet/csharp/pattern-matching:“模式匹配表达式的语言规则可以帮助你避免误用匹配表达式的结果。在上面的例子中,变量s、c和r只在作用域和当相应的模式匹配表达式具有真实结果时肯定会分配。如果您尝试在另一个位置使用任一变量,您的代码会生成编译器错误。所以我怀疑虽然它愿意检测特殊情况!并翻转 if 和(有效) else 分支,它不愿意解析所有可能的表达式。

标签: c# c#-7.0


【解决方案1】:

更新的答案感谢Julien 提出 GitHub 问题。

查看 Neal Gafter 的回复(此处复制自 here):

但是,您看到的错误与范围无关。它是关于 确定的任务。模式变量在以下情况下被明确分配 模式匹配表达式为真。一元!运算符反转 分配时为真和分配时为假。然而,布尔值 相等运算符 == 抛弃了 分配时为真和分配时为假。


我相信comboBox 变量只有在模式匹配时才会被创建。

【讨论】:

    猜你喜欢
    • 2017-06-09
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    相关资源
    最近更新 更多