这可能是非常蹩脚的问题,但我发现C#规范中没有关于圆括号的引用。如果对这个问题的回答很明显,请指向spec或msdn。
C#中的(MyType)SomeObj.Property1和(MyType)(SomeObj.Property1)之间的内在差异是什么?
AFAIK,在第一种情况下((x)SomeObj.Property1 cast) - 它将是Property1的具体类型(MyType)的引用。在第二种情况下,这样的引用将执行get访问器SomeObj.get_Property1。 如果获取访问者有任何副作用(并且经常 - 确实有副作用),它最终可能导致细微的错误
有人能指出我指明这种行为的确切文件吗?
更新:感谢您的指点。我表示深深的歉意对这种愚蠢的问题 - 张贴这个问题后,我发现的例子,我拨弄在一个错字,从而认识到,第二种情况的行为不是基于代码中,我试图编译,但以前编译完全不同的代码。所以我的问题最初是基于我自己的失明......
答案 0 :(得分:2)
绝对没有区别。 .
运算符比类型转换运算符绑定得更紧密,因此额外的括号没有区别。有关运算符优先级的详细信息,请参阅here;有问题的运营商属于前两组。
答案 1 :(得分:2)
它们是等价的。这取决于C#语言中的运算符优先级规则,C#语言规范中的第7.2.1节:
.
运算符位于此列表的顶部,转换运算符是列表中的第二个运算符。 .
运算符“获胜”。如果需要强制转换,您将使用括号,因为 Property1 是MyType类的属性:
((MyType)SomeObj).Property1