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

2 ответа

Решение

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

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

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

Документ о приоритете операторов теперь (возможно, благодаря user8528014) имеетswitchвыражение указано:

Другие вопросы по тегам