C# 算子的结合性

C# 算子的结合性,c#,language-lawyer,C#,Language Lawyer,在C#规范中说: 除了赋值运算符和空合并运算符, 所有二进制运算符都是左关联的,这意味着操作是左关联的 从左到右执行 赋值运算符、空合并运算符和 条件运算符(?:)是右关联的,这意味着 从右到左执行操作 这已经足够清楚了,但是像default,delegate,stackalloc,这样的操作符等待着他们如何分类?它们的关联性是什么 这同样适用于[],(),例如;它们是一元运算符还是二元运算符,或者从技术上说它们都不是,因为根据标准的一元运算符类似于op x,而二元运算符类似于x op y?这里

在C#规范中说:

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

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

这已经足够清楚了,但是像
default
delegate
stackalloc
这样的操作符等待着他们如何分类?它们的关联性是什么


这同样适用于
[]
()
,例如;它们是一元运算符还是二元运算符,或者从技术上说它们都不是,因为根据标准的一元运算符类似于op x,而二元运算符类似于x op y?

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

所有主一元运算符(
new
typeof
default
checked
unchecked
delegate
)都有语法规则,这意味着它们不是问题-基本上,您可以通过括号/大括号的位置来判断操作数。如果没有括号,可能会出现问题。例如,假设未选中的
操作符不需要括号。那么这个,

unchecked x . y
可能意味着
未选中(x.y)
(未选中x.y)
,而没有更多规则。但这不是问题,因为它无论如何都是无效的


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

您提到的“运算符”都不是二进制的。请问一个更具体的问题。你能提供一个你不确定结果的代码示例吗?@JonSkeet它在
Primary Operators
seciton页面上出现是不是很奇怪?@SonerGönül:非常奇怪。正在别处查看。。。也许我错了。我看到它也在C#5规范和ECMA标准中。嗯,是的,我想我错了。删除我的第一条注释:)那么对于像typeof、checked等主要操作符的operators关键字,我们是否可以推断,当它们与()一起使用时,它们就像二进制操作符,所以从左到右关联?相反,关键字await已经被归类为一元运算符,然后从右向左关联(我们不能将()与它一起使用)。感谢您的耐心:)@xdevel2000:同样,只有当有两个具有相同优先级的运算符时,关联性才相关,这样一个操作数可能是其中一个“第一个”的一部分。你能举例说明你认为这与
typeof
等有什么关系吗?