Почему _ret оценивается как true, не должно ли оно иметь значение false (битовый оператор)? - PullRequest
2 голосов
/ 22 июля 2011
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

Ответы [ 3 ]

2 голосов
/ 22 июля 2011

Как объяснил Эрик Липперт в своем блоге «Прецедентность против ассоциативности против порядка»,

Выражение F () + G () * H () эквивалентно F () + (G () * H ()), но C # НЕ оценивает G () * H () до F ().Скорее, это эквивалентно:

temp1 = F ();

temp2 = G ();

temp3 = H ();

temp4= temp2 * temp3;

result = temp1 + temp4;

Итак, в вашем случае он оценивает _ret до вызова метода () и тот факт, что _ret изменяется внутри метода () не влияет на внешний вызов.

См .: http://blogs.msdn.com/b/ericlippert/archive/2008/05/23/precedence-vs-associativity-vs-order.aspx

2 голосов
/ 22 июля 2011

Моя ставка в том, что _ret & = Method () переводится в _ret = _ret & Method (), а _ret в RHS оценивается до вызова метода ().

Так как _ret изначально имеет значение true, это верно, когда он оценивает _ret в RHS, а затем _ret изменяется на false в Method (), но это не имеет значения, поскольку Method () возвращает true и true & true = true.

Вероятно, это зависит от компилятора / среды ... оно основано на оценке слева направо, на которую не стоит рассчитывать.

0 голосов
/ 22 июля 2011

Ваш метод возврата должен быть таким, как показано ниже

    private static bool Method() 
    {
        return _ret &= false; 
    } 
...