运营商的相关性

时间:2015-12-14 13:10:50

标签: c# language-lawyer

在C#规范中说:

  

除了赋值运算符和空合并运算符之外,   所有二元运算符都是左关联的,这意味着操作是   从左到右进行。

     

赋值运算符,空合并运算符和   条件运算符(?:)是右关联的,意思是   操作从右到左执行。

这是否足够明确,但defaultdelegatestackallocawait等运营商如何归类?他们的关联性是什么?

[]()也是如此,例如;它们是一元的还是二元的,或者在技术上都不是它们,因为根据标准的一元运算符类似于 op x 而二元运算符类似于 x op y

1 个答案:

答案 0 :(得分:2)

这里没有问题,因为所有非主要一元运算符具有相同的优先级,并且所有二进制运算符具有不同的优先级。当操作数位于具有相同优先级的两个运算符之间时,关联性生效 - 但操作数不能位于两个非主要一元运算符之间。

所有主要一元运算符(newtypeofdefaultcheckedunchecked和{{1}有语法规则意味着它们不是问题 - 基本上,你可以告诉操作数括号/括号的位置。如果没有括号,可能会出现问题。例如,假设delegate运算符不需要括号。然后这个:

unchecked
如果没有更多规则,

可能意味着unchecked x . y unchecked(x.y)。但这不是问题,因为它无论如何都无效。

值得注意的是,规范中的优先级和关联性解释实际上只是信息性的 - 精确的规则已经用语言的语法编码。换句话说,可以从规范中删除该部分而不影响任何程序的有效性或含义。 (也很好,因为有一些错误,IIRC ...)