2011-01-28 16 views
6

コントローラのアクションから返すActionResultを決定するとき、私は、より長めのif-elseとは対照的に、三項演算子を使うことに決めました。ここに私の問題です...RedirectToAction()対View()および三項演算子ですか?

このコードは

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

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

私はこのコードの簡潔さが気に入っていますが、キャスティングは正しくないようです。誰でも私を啓発することはできますか?

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

ok ...私が気づいたのは、updatedCategoryで編集アクションに戻っても関係なく、モデルが有効であることを確認する必要がないためです。誰かが助けることができれば、その質問に対する答えを知りたいのは私はまだ不思議です。

答えて

9

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

例では、xはRedirectToRouteResultであり、yはViewResultです。 RedirectToRouteResultをViewResultに、またはその逆に変換することはできません。 の場合の両方をActionResultに変換することができます。そのため、ActionResultにキャストした場合、xの型はActionResult、yはActionResultに変換され、全体の結果はActionResult型になります。

私は...正しくそこに私はの正確な意味を知らない怖い自分自身を説明してきた希望?:演算子私はめったにそれを自分自身を使用しないよう...

+0

のようです。 +1 –

+2

C#リファレンス、http://msdn.microsoft.com/en-us/library/ty67wk28.aspx: "... first_expressionとsecond_expressionの型が同じであるか、_implicit_変換が1つ存在する必要がありますもう片方にタイプしてください。 " +1 –

+0

は理にかなっています。私は迅速な対応に感謝します。 @Andrasは参考に感謝します。私はそれのC#側をもっと見ていたはずです。はっきりとこれがフレームワークの問題ではなく言語の問題であるとき、私はASP.NET MVC側につきました。 –

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;