在C#规范中说:
除了赋值运算符和空合并运算符之外, 所有二元运算符都是左关联的,这意味着操作是 从左到右进行。
赋值运算符,空合并运算符和 条件运算符(?:)是右关联的,意思是 操作从右到左执行。
这是否足够明确,但default
,delegate
,stackalloc
,await
等运营商如何归类?他们的关联性是什么?
对[]
,()
也是如此,例如;它们是一元的还是二元的,或者在技术上都不是它们,因为根据标准的一元运算符类似于 op x 而二元运算符类似于 x op y ?
答案 0 :(得分:2)
这里没有问题,因为所有非主要一元运算符具有相同的优先级,并且所有二进制运算符具有不同的优先级。当操作数位于具有相同优先级的两个运算符之间时,关联性生效 - 但操作数不能位于两个非主要一元运算符之间。
所有主要一元运算符(new
,typeof
,default
,checked
,unchecked
和{{1}有语法规则意味着它们不是问题 - 基本上,你可以告诉操作数括号/括号的位置。如果没有括号,可能会出现问题。例如,假设delegate
运算符不需要括号。然后这个:
unchecked
如果没有更多规则,可能意味着unchecked x . y
或unchecked(x.y)
。但这不是问题,因为它无论如何都无效。
值得注意的是,规范中的优先级和关联性解释实际上只是信息性的 - 精确的规则已经用语言的语法编码。换句话说,可以从规范中删除该部分而不影响任何程序的有效性或含义。 (也很好,因为有一些错误,IIRC ...)