Объявление встроенной переменной не скомпилируется при использовании '== 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
вместо оператора отрицания, может кто-то объяснить, почему один компилируется, а другой нет?
Ответы
Ответ 1
Обновленный ответ Спасибо Жюльюну, открыв проблему GitHub.
См. Ответ Нила Гафтера (скопированный здесь отсюда):
Однако ошибка, которую вы видите, касается не объема. Речь идет о определенном задании. Переменная шаблона определенно назначается, когда выражение соответствия шаблону истинно. Унарный! оператор отменяет присваиваемые-когда-true и присваивается-когда-false. Однако логический оператор равенства == отбрасывает различие между присваиваемым-когда-true и присваивается-когда-false.
Я считаю, что переменная comboBox
будет создана только в том случае, если шаблон совпадает.