2

次のコード行は、次の「代入呼び出しインクリメント デクリメントのみをステートメントとして使用できます」を引き起こしています。

iRowsEffected == 0 ? trans.Rollback() : trans.Commit();

if else の短縮形を何度も使用しましたが、このエラーを受け取ったことはありません。

4

2 に答える 2

8

if else の短縮形を何度も使用しましたが、このエラーを受け取ったことはありません。

それなら、あなたは今までずっとそれを適切に使ってきたのではないかと思います。

条件演算子は単なる「if / else」の省略形ではありません...式を評価するための構文です-式の結果は、最初のオペランドを評価した結果に基づいて、2番目または3番目のオペランドを評価した結果です。オペランド。

3 つのオペランドはすべて非 void である必要があり、式の結果はどこかで使用する必要があります (たとえば、プロパティ アクセスなど)。

ここでは、1 つまたは別の void メソッドを実行しようとしているだけなので、次のようにします。

if (iRowsAffected == 0) // Fixed typo in name
{
    trans.Rollback();
}
else
{
    trans.Commit();
}

本当に、本当に、本当に条件演算子を使用したい場合は、メソッド グループの変換に使用できます。

Action completion = iRowsAffected == 0 ? (Action) trans.Rollback : trans.Commit;
completion();

(第 2 オペランドまたは第 3 オペランドのいずれかをキャストて、もう一方のオペランドを変換する必要がありますが、どちらをキャストするかは問題ではなく、両方をキャストする必要はありません。)

または、ファウルステートメントで:

// Don't do this. Please.
(iRowsAffected == 0 ? (Action) trans.Rollback : trans.Commit)();

ただし、これを行わないでください。完全を期すためにのみ含めました。

于 2013-07-18T21:22:44.890 に答える
5

条件演算子ifは句の代わりではありません。ブール式に従って 2 つの異なる値を返し、この値を変数に割り当てるために使用されます。ただし、両方のメソッドが「返され」void、ここでは何も割り当てません。

ifここでは単純な-が必要ですelse:

if(iRowsEffected == 0)
    trans.Rollback();
else
    trans.Commit();
于 2013-07-18T21:22:38.313 に答える