2
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;
    }
}

我们在我们正在开发的一个更大的应用程序中遇到了这个问题,并且想知道它是否是预期的功能?这是用 c# 和 Visual Studio 2010 编写的

4

3 回答 3

2

我敢打赌 _ret &= Method() 被翻译成 _ret = _ret & Method() 并且 RHS 上的 _ret 在 Method() 被调用之前被评估。

由于 _ret 最初为 true,因此在 RHS 中计算 _ret 时为 true,然后在 Method() 中将 _ret 更改为 false,但这并不重要,因为 Method() 返回 true 并且 true & true = true。

这可能是编译器/环境特定的......它依赖于从左到右的评估,你不应该指望它。

于 2011-07-22T18:28:39.540 回答
2

正如 Eric Lippert 在他的博文“Precedence vs Associativity vs Order”中所解释的,

表达式 F() + G() * H() 等价于 F() + (G() * H()),但 C# 不会在 F() 之前计算 G() * H()。相反,这相当于:

temp1 = F();

温度2 = G();

temp3 = H();

温度 4 = 温度 2 * 温度 3;

结果 = 温度 1 + 温度 4;

因此,在您的情况下,它会在调用 Method() 之前评估 _ret,并且 _ret 在 Method() 内部更改的事实不会影响外部调用。

请参阅:http: //blogs.msdn.com/b/ericlippert/archive/2008/05/23/precedence-vs-associativity-vs-order.aspx

于 2011-07-22T18:52:24.023 回答
0

您的方法返回应该如下所示

    private static bool Method() 
    {
        return _ret &= false; 
    } 
于 2011-07-22T18:56:57.747 回答