a)点运算符(a.x)和索引运算符(a [x])都具有相同的优先级。那么基于什么优先规则,表达式a[x].SomeMember
被评估为(a[x]).SomeMember
而不是(a.SomeMember )[x]
?
b)构造运算符是一元运算符(因此优先级低于点运算符),因此表达式(int)a.x
的计算结果为(int)(a.x)
?
谢谢
答案 0 :(得分:2)
对于a)
来自C#规范,第7.2.1节:
当操作数出现在两个具有相同优先级的运算符之间时,运算符的关联性控制着执行操作的顺序:
- 除赋值运算符外,所有二元运算符都是左关联运算符,这意味着操作从左到右执行。例如,x + y + z被评估为(x + y)+ z。
- 赋值运算符和条件运算符(?:)是右关联的,这意味着操作是从右到左执行的。例如,x = y = z被评估为x =(y = z)。
这意味着在这种情况下,操作员将从左到右获得优先权。
b)是的,这是正确的。这是一个Cast表达式,在7.6.6节中描述,它应用于一元表达式,并且使用一元运算符(第7.6节)对强制转换进行分类,并使用相同的优先级进行处理。
答案 1 :(得分:1)
a)优先权是从左到右的优先顺序。在评估引用时,编译器从左到右继续确定哪些相等的运算符接收优先级。由于[x]在[x] .SomeMember之前,因此首先引用它。
b)它不是一元运算符,但它具有与一元一样的优先级。
答案 2 :(得分:1)