Каков приоритет оператора для новых выражений переключателя C # 8.0? - PullRequest
1 голос
/ 25 сентября 2019

Я только что обновил свой текущий проект до недавно выпущенного .NET Standard 2.1 и C # 8.0 и решил преобразовать некоторые большие операторы switch в новый, гораздо более компактный синтаксис выражений .

Поскольку возвращаемые значения в дальнейшем используются в некоторых вычислениях, мне было интересно, как ведут себя новые выражения switch, когда входная переменная находится рядом с оператором.

Возьмем следующий пример для конкатенации строк:

string input = Console.ReadLine();
string output = "Letter: " + input switch
{
    "1" => "a",
    "2" => "b",
    _ => "else"
};
Console.WriteLine(output);

Я предполагаю, что switch очень сильно связывается с переменной input и, таким образом, вычисляется первым.И действительно, это печатает Letter: a, когда я набираю 1.

Но мой вопрос сейчас такой: Применимо ли это поведение к любому оператору?

Из моегоВ ходе экспериментов мне не удалось определить условие, при котором вышеприведенная гипотеза не выполняется, но это, очевидно, не означает, что я не пропустил ни одного случая.Документы также не упоминают приоритет операторов в контексте switch выражений.Или у меня здесь есть более глубокое недоразумение?

1 Ответ

2 голосов
/ 25 сентября 2019

Источник в Roslyn предполагает, что действительно switch выражения имеют довольно высокий приоритет, но есть некоторые вещи с более высоким приоритетом, такие как диапазоны, унарные операторы и приведение типов.См. здесь и здесь в источнике Roslyn.

Пример кода, который демонстрирует более высокий приоритет SyntaxKind.LogicalNotExpression (Precende.Unary):

var foo = false;
var bar = !foo switch {
    true => "true",
    false => "false"
};
Console.WriteLine(bar); // writes "true"
...