На null оператор `is` проверяет, но только старый оператор, `value is Type`. Новый оператор, `value is pattern`, доверяет все проверки паттерну, а паттерн уже сам решает, что проверять и какие переменные создавать.
Паттерн `var x` ничего не проверяет, он просто создаёт x, пишет туда то, что получил и возвращает true.
Дисконнект есть не между семантикой паттерна `var` и объявления переменной с выводом типа, а между паттерном `Type x`, который хочет получить на вход ненулевое значение и объявлением переменной `Type x`, которой может быть присвоен null.
Но это сгладится введением Nullable Reference Types в C#8, где `Type x = null;` будет выдавать предупреждение.
Уважаемый Makeman, скопирую сюда свой комментарий из обсуждения на гитхабе.
var x и Type x — это не один и тот же паттерн, они просто похожи. Type (x тут опционален) нужен в первую очередь для проверки типа, а уже во вторую очередь для присвоения сматченного значения переменной. var x (без переменной тут не обойтись) нужен в первую очередь для присвоения любого значения переменной и используется как подпаттерн для деконструкции. Он не матчит принципиально, а получает значение от надпаттерна.
Да, если использовать его как самостоятельный паттерн, то получается, что он просто матчит значение целиком и пишет его в переменную безо всякой проверки. Но если добавить тут в логику проверку на null, то сломается его основная функция — записывать в переменную кусок разобранного паттерна. Ну и вообще, я же могу написать var x = default(string);? var тут не пытается проверить, null я записываю или нет.
И вообще, не надо использовать паттерн-матчинг для проверки на null. Во-первых, можно написать if (x != null), и в C#8 x внутри консеквента станет гарантированно непустым значением. Если нужно обязательно использовать switch, то там есть паттерн null, можно написать
switch (x) {
case is null: ...
case _: ... //тут можно использовать x
}
Я надеюсь, что в C#8 внутри case _: значение x также станет непустым.
Паттерн `var x` ничего не проверяет, он просто создаёт x, пишет туда то, что получил и возвращает true.
Дисконнект есть не между семантикой паттерна `var` и объявления переменной с выводом типа, а между паттерном `Type x`, который хочет получить на вход ненулевое значение и объявлением переменной `Type x`, которой может быть присвоен null.
Но это сгладится введением Nullable Reference Types в C#8, где `Type x = null;` будет выдавать предупреждение.
Уважаемый Makeman, скопирую сюда свой комментарий из обсуждения на гитхабе.
var x
иType x
— это не один и тот же паттерн, они просто похожи.Type
(x тут опционален) нужен в первую очередь для проверки типа, а уже во вторую очередь для присвоения сматченного значения переменной.var x
(без переменной тут не обойтись) нужен в первую очередь для присвоения любого значения переменной и используется как подпаттерн для деконструкции. Он не матчит принципиально, а получает значение от надпаттерна.Да, если использовать его как самостоятельный паттерн, то получается, что он просто матчит значение целиком и пишет его в переменную безо всякой проверки. Но если добавить тут в логику проверку на
null
, то сломается его основная функция — записывать в переменную кусок разобранного паттерна. Ну и вообще, я же могу написатьvar x = default(string);
?var
тут не пытается проверить,null
я записываю или нет.И вообще, не надо использовать паттерн-матчинг для проверки на
null
. Во-первых, можно написатьif (x != null)
, и в C#8x
внутри консеквента станет гарантированно непустым значением. Если нужно обязательно использоватьswitch
, то там есть паттернnull
, можно написатьЯ надеюсь, что в C#8 внутри
case _:
значениеx
также станет непустым.