Объявление встроенной переменной не скомпилируется при использовании '== 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 будет создана только в том случае, если шаблон совпадает.