新的 C# 8.0 开关表达式的运算符优先级是啥?

Posted

技术标签:

【中文标题】新的 C# 8.0 开关表达式的运算符优先级是啥?【英文标题】:What is the operator precedence for the new C# 8.0 switch expressions?新的 C# 8.0 开关表达式的运算符优先级是什么? 【发布时间】:2020-01-25 00:53:00 【问题描述】:

我刚刚将我当前的项目升级到新发布的 .NET Standard 2.1 和 C# 8.0,并决定将一些大的 switch 语句转换为新的、更紧凑的 expression syntax。

由于返回的值在某些计算中被进一步使用,我想知道当输入变量靠近运算符时,新的switch 表达式会如何表现。

以下面的字符串连接为例:

string input = Console.ReadLine();
string output = "Letter: " + input switch

    "1" => "a",
    "2" => "b",
    _ => "else"
;
Console.WriteLine(output);

我猜switchinput 变量的绑定非常紧密,因此首先被评估。事实上,当我输入 1 时,这会打印出 Letter: a

但我现在的问题是:这种行为是否适用于任何运营商?

从我的实验中,我无法确定上述假设不成立的情况,但这显然并不意味着我没有遗漏任何情况。文档似乎也没有在 switch 表达式的上下文中提及运算符优先级。还是我这里有更深的误解?

【问题讨论】:

【参考方案1】:

Roslyn 消息来源表明,switch 表达式确实具有相当高的优先级,但有些东西具有更高的优先级,例如范围、一元运算符和强制转换。请参阅 Roslyn 源中的 here 和 here。

演示SyntaxKind.LogicalNotExpression (Precende.Unary) 优先级更高的示例代码:

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

【讨论】:

不错的发现,没想到直接查看 Roslyn 的资源。我将创建一个问题以将其包含在文档中:)

以上是关于新的 C# 8.0 开关表达式的运算符优先级是啥?的主要内容,如果未能解决你的问题,请参考以下文章

c#运算符的优先级

在新开关 c# 8.0 中使用 lambda 函数返回值

C语言运算的优先级别和结合方向表是啥的?

c# 8.0 switch 表达式中的多个案例[重复]

运算符“<<”在 C# 中是啥意思?

C# 运算符的优先级和关联性