2012-02-16 9 views
14

これはあなたがdecimal?3進演算子で10進数にnullを割り当てることができないのはなぜですか?

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
    ? (decimal?)decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
    : null; 
+2

読者は気にしませんが、何が問題なのですか? –

+2

条件演算子と呼ばれていますが、明確ですが、三項演算子 –

+0

@JakubKoneckiではありません。できるだけ多くの情報を提供することは常に良いことです。この場合、コンパイルエラー –

答えて

34

にキャストすることができますし、型指定されたオブジェクトに割り当てる必要があります。

これは動作するはずです:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
     ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
     : (decimal?)null; 

か、これは少し優れている:ここでは

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
     ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
     : default(decimal?); 

defaultキーワードのMSDNのリンクです。

+0

ありがとうございました。 –

+1

fanbloodytastic! – northpole

+3

最高のレスポンスは答えているだけではなく、情報を伝えて教育するものです。素敵なスラブスター –

2

はこれを試してみてください動作しませんなぜ私が理解することはできません。

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) ? 
         decimal.Parse(txtLineCompRetAmt.Text.Replace(",", "")) : 
         (decimal?) null; 

問題は、コンパイラはどのタイプがnullを持っているのか分からないということです。だから、nullは(事実上型なし)タイプobjectであるので、あなただけのdecimal?

+1

それは違いはありません。 'decimal'は' decimal? 'に入れることができます。 –

+0

"三項演算子の出力タイプは最初のパートのタイプです":これは真ではありません...第1パートと第2パートのどちらのタイプでもかまいません。その間の変換に応じて –

+1

'decimal'から' decimal? 'に変換します。 – slugster

3
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) ? 
          decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) : 
          (decimal?)null; 
5

に最初の部分をキャストする必要が

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
    ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
    : null; 
3

コンパイラは、条件演算子のオペランドから最適な型を推論できないためです。あなたがcondition ? a : bを書くとき

は、bのタイプに、またはbのタイプからaの種類にaのタイプから暗黙の変換が存在する必要があります。コンパイラは、式全体の型をこの変換のターゲット型として推論します。タイプdecimal?の変数に代入するということは、決してコンパイラによって考慮されません。あなたのケースでは、abのタイプはdecimalであり、未知の参照またはヌル入力可能なタイプです。コンパイラは、あなたが何を意味するかを推測することはできませんので、あなたはそれを支援する必要があります。

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
          ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
          : default(decimal?); 
6

decimal.Parseを使用しないでください。

Convert.ToDecimalは、null文字列が指定されている場合は0を返します。 decimal.Parseは、解析する文字列がnullの場合にArgumentNullExceptionをスローします。

関連する問題