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

私たちが開発しているより大きなアプリケーションでこの問題に遭遇し、それが期待される機能であるかどうか疑問に思いましたか?これは、Visual Studio 2010でC#で記述されています

4

3 に答える 3

2

私の賭けは、_ret&= Method()が_ret = _ret&Method()に変換され、Method()が呼び出される前にRHSの_retが評価されていることです。

_retは最初はtrueであるため、RHSで_retを評価し、次にMethod()で_retがfalseに変更されるとtrueになりますが、Method()はtrueとtrue&true = trueを返すため、これは問題ではありません。

これはおそらくコンパイラ/環境に固有です...それは左から右への評価に依存しているので、信頼するべきではありません。

于 2011-07-22T18:28:39.540 に答える
2

EricLippertがブログ投稿「PrecedencevsAssociativityvs Order」で説明しているように、

式F()+ G()* H()はF()+(G()* H())と同等ですが、C#はF()の前にG()* H()を評価しません。むしろ、これは次と同等です。

temp1 = F();

temp2 = G();

temp3 = H();

temp4 = temp2 * temp3;

結果=temp1+ temp4;

したがって、あなたの場合、Method()を呼び出す前に_retを評価し、Method()内で_retが変更されるという事実は外部呼び出しに影響を与えません。

参照: 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 に答える