class Program
{
private static bool _ret = true;
static void Main()
{
_ret &= Method();
Console.WriteLine(_ret);
Console.Read();
}
private static bool Method()
{
_ret &= false;
return true;
}
}
我们在一个正在开发的更大的应用程序中遇到了这个问题,并且想知道它是否是预期的功能?这是用Visual Studio 2010的c#编写的
答案 0 :(得分:2)
我敢打赌_ret& = Method()被翻译成_ret = _ret&在调用Method()之前,正在评估RHS上的Method()和_ret。
因为_ret最初是真的,所以当它在RHS中评估_ret时是正确的,然后_ret在Method()中被改为false,但这并不重要,因为Method()返回true和true& true = true。
这可能是特定于编译器/环境的......它依赖于从左到右的评估,你不应该依赖它。
答案 1 :(得分:2)
正如Eric Lippert在他的博客文章“Precedence vs Associativity vs Order”中所解释的那样,
表达式F()+ G()* H()等价于F()+(G()* H()),但 C#不会在F()之前计算G()* H()。相反,这是等效的 到:
temp1 = F();
temp2 = G();
temp3 = H();
temp4 = temp2 * temp3;
result = temp1 + temp4;
因此,在您的情况下,它在调用Method()之前评估_ret,并且_ret在Method()中更改的事实不会影响外部调用。
请参阅:http://blogs.msdn.com/b/ericlippert/archive/2008/05/23/precedence-vs-associativity-vs-order.aspx
答案 2 :(得分:0)
您的方法返回应如下所示
private static bool Method()
{
return _ret &= false;
}