Каков приоритет операторов для новых выражений переключателя 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
выражение указано: