基于什么优先规则是[x] .SomeMember评估为(a [x])。SomeMember而不是......?

时间:2010-02-10 18:56:56

标签: c# .net clr

a)点运算符(a.x)和索引运算符(a [x])都具有相同的优先级。那么基于什么优先规则,表达式a[x].SomeMember被评估为(a[x]).SomeMember而不是(a.SomeMember )[x]

b)构造运算符是一元运算符(因此优先级低于点运算符),因此表达式(int)a.x的计算结果为(int)(a.x)

谢谢

3 个答案:

答案 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)它不是一元运算符,但它具有与一元一样的优先级。

Precedence of the C# Operators

答案 2 :(得分:1)

a)基于代码序列。出于同样的原因,a = bb = a的解释不同!

b)如here所述,Casting是一元运算符。其具体行为解释为here