次のコード行は、次の「代入呼び出しインクリメント デクリメントのみをステートメントとして使用できます」を引き起こしています。
iRowsEffected == 0 ? trans.Rollback() : trans.Commit();
if else の短縮形を何度も使用しましたが、このエラーを受け取ったことはありません。
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)();
ただし、これを行わないでください。完全を期すためにのみ含めました。
条件演算子if
は句の代わりではありません。ブール式に従って 2 つの異なる値を返し、この値を変数に割り当てるために使用されます。ただし、両方のメソッドが「返され」void
、ここでは何も割り当てません。
if
ここでは単純な-が必要ですelse
:
if(iRowsEffected == 0)
trans.Rollback();
else
trans.Commit();