使用’== false’而不是否定运算符时,内联变量声明不会编译
请考虑以下代码段:
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
而不是使用否定运算符的原因的辩论中,有人可以解释为什么编译而另一个不编译?
更新的答案感谢Julien打开GitHub问题。
请参阅Neal Gafter的回复(此处复制):
但是,您看到的错误与范围无关。 这是关于明确的任务。 当模式匹配表达式为true时,明确赋予模式变量。 一元! 运算符反转assign-when-true和assign-when-false。 但是,布尔等式运算符==抛弃了assigned-when-true和assigned-when-false之间的区别。
我相信只有在模式匹配时才会创建comboBox
变量。