【发布时间】: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 分支,它不愿意解析所有可能的表达式。