Каков приоритет операторов для новых выражений переключения C # 8.0?

Я только что обновил свой текущий проект до недавно выпущенных .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 выражений. Или у меня здесь более глубокое недопонимание?


person janw    schedule 24.09.2019    source источник


Ответы (1)


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

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

var foo = false;
var bar = !foo switch {
    true => "true",
    false => "false"
};
Console.WriteLine(bar); // writes "true"
person Chris Yungmann    schedule 24.09.2019
comment
Хорошая находка, у меня не было идеи напрямую проверять источники Roslyn. Я создам задачу, чтобы включить это в документы :) - person janw; 26.09.2019