1

だから私は呼ばれる簡単な方法がありInvertます:

public static void Invert(this bool value)
{
    value = !value;
}

これは、ファイル内の静的クラスの内部にあり.dllます。これで、新しいWinformsプロジェクトに移動するときに.dll、参照としてを追加しました。これまでのところ、すべてが順調です。今私がこれをするとき:

bool test = true;
test.Invert();

エラーは発生しませんが、エラーが発生した場合:

MessageBox.Show(test.ToString());

true何も変わっていないかのように出力します。私がその方法で何をしているのか、それとも他の何かのせいなのかはわかりません。しかし、私が行く場合:

MessageBox.Show((!test).ToString());

を出力しますfalse

ありがとう。

4

3 に答える 3

7

それは正しく機能しています。boolは値型であるため、値として渡され、元の変数( test)は変更されません。

代わりに、次のようなことを行う必要があります。

public static bool Invert(this bool value) 
{ 
    return !value; 
} 

ただし、言語自体が実行することを実行するメソッドを作成することは、少し時間の無駄です。

拡張メソッドでは参照によってパラメーターを取得できるとは思わないthisので、通常の静的メソッドを使用して、長い道のりで呼び出す必要があります。

public static bool Invert(ref bool value) { value = !value; }

BooleanHelpers.Invert(ref test);

結局、このようにするだけで、はるかにクリーンで簡単になります(他の開発者にとっては言うまでもありません)。

test = !test;
于 2012-07-05T02:23:26.553 に答える
2

拡張メソッドは、bool参照ではなく、値で取り込みます。メソッドの本体はbool、呼び出し元が所有する元の値ではなく、のローカルコピーを変更しています。

于 2012-07-05T02:22:09.373 に答える
0

boolは値型であり、参照によって渡されていません。Invertを持続させるには、の結果を別の変数または同じ変数に割り当てる必要があります。

于 2012-07-05T02:22:19.653 に答える