Что произойдет, если мое выражение переключателя C # не является исчерпывающим? - PullRequest
0 голосов
/ 10 мая 2019

В C # 8 были введены выражения переключения. Что происходит, если выражение switch не является исчерпывающим? Другими словами, что произойдет, если я не проверю все возможные значения?

    static void Main(string[] args)
    {
        int x = 1;
        int imExhaustive = x switch
        {
            3 => 4,
            _ => 0   // x = 1 matches this
        };
        int okFine = x switch
        {
            1 => 4   // x = 1 matches this
        };
        int noMatch = x switch
        {
            3 => 4   // No match
        };
    }

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Если выражение switch не является исчерпывающим, компилятор выдает предупреждение. Во время выполнения, если вы передаете значение, которое не обрабатывается, выдается SwitchExpressionException.

Это описано в спецификации новых шаблонов в C # 8.0: https://github.com/dotnet/csharplang/blob/master/proposals/csharp-8.0/patterns.md#switch-expression

Компилятор должен выдавать предупреждение, если оно доказывает (используя те методы), что некоторые возможные входные значения могут не соответствовать некоторым switch_expression_arm во время выполнения.

Во время выполнения результатом switch_expression является значение выражение первого switch_expression_arm, для которого выражение в левой части выражения switch_expression соответствует шаблон switch_expression_arm, и для которого case_guard из Параметр switch_expression_arm, если присутствует, имеет значение true.

Если нет такое switch_expression_arm, switch_expression генерирует экземпляр исключения System.Runtime.CompilerServices.SwitchExpressionException.

0 голосов
/ 10 мая 2019

Зависит.

Если есть совпадение: оно совпадает, и все в порядке.

Если совпадений нет: выбрасывается SwitchExpressionException.

Лучше всего писать исчерпывающие выражения переключателей. Если нет, и ничего не взрывается, возможно, вам просто повезло.

Компилятор предупредит вас, если ваше выражение switch не является исчерпывающим, но это не ошибка, и он все равно скомпилируется и запустится.

(просто наткнулся на это, поэтому подумал, что поделюсь - пока нигде нет в документации, хотя C # 8 все еще в Preview)

...