6

コントローラアクションから返すActionResultを決定するとき、より長いif-elseではなく、3項演算子を使用することにしました。これが私の問題です...

このコードは機能します

return
    ModelState.IsValid ?
    (ActionResult) RedirectToAction("Edit", new { id = id }) :
    View(new EditViewModel(updatedCategory));

しかし、これはしません

return 
     ModelState.IsValid ?
     RedirectToAction("Edit", new { id = id }) :
     View(new EditViewModel(updatedCategory));

if-elseを使用する場合は、明示的なキャストを行う必要はありません。さらに、RedirectToAction()とView()の両方がActionResult派生物を返します。

私はこのコードの簡潔さが好きですが、そのキャストは正しくないようです。誰かが私を啓発できますか?

これは明らかですが、EditViewModelは私の編集アクションのビューモデルであり、updatedCategoryはEF4オブジェクトです。しかし、これはこの問題に関連しているとは思いません。

わかりました...updatedCategoryを使用して編集アクションに戻っても、モデルが有効であることを確認する必要がないため、自分が行っていたことが不要であることに気付きました。誰かが助けてくれるなら、私はまだ質問への答えを知りたいです。

4

2 に答える 2

9

?:演算子を使用するときの引数は、条件?などでそれらの間で変換可能でなければならないためだと思います。x:yxをyまたはyをxに変換できる必要があります。その場合、結果のタイプは2つの中で最も具体的ではありません。したがって、xがオブジェクトでyaが文字列の場合、文字列をオブジェクトにキャストすると、結果はobject型になります。

この例では、xはRedirectToRouteResultであり、yはViewResultです。RedirectToRouteResultをViewResultに、またはその逆に変換することはできません。ただし、両方をActionResultに変換できます。そのため、ActionResultにキャストすると、機能します。xのタイプはActionResultになり、yはActionResultに変換でき、全体の結果はActionResultのタイプになります。

そこで自分自身を正しく説明したことを願っています...自分で使用することはめったにないので、?:演算子の正確なセマンティクスがわからないのではないかと思います...

于 2011-01-28T14:44:01.083 に答える
0

データ型は代入変数で完全に同じである必要があり、ここでの両方の戻り型は私が考えることができる最も単純な例です。

int originalValue = 10;
int? value = (originalValue != 10) ? null : originalValue;

//Which is very easily fixed with type casting as you have done

int? value = (originalValue != 10) ? null : (int?)originalValue;
于 2014-03-19T19:22:42.040 に答える