All streams
Search
Write a publication
Pull to refresh
4
0.1
Send message
Да, в превью такое есть. Только один восклицательный знак, а не два.
Докер точно не предоставляет макось и не предоставляет винду и никсы на одном хосте. Так что только виртуалки.
На 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 также станет непустым.

12 ...
9

Information

Rating
4,149-th
Registered
Activity