2017-11-23 9 views
0
int a = 1; 
    int? b = a; 
    Console.WriteLine(b); 

上記のスニペットが細かく、int?に直接intを変換する、明示的な変換はC#:なぜintから<Nullable> intへの明示的な変換ですか?

を必要としないが、

List<int> temp = new List<int>{1};  
int? valueVariable = temp!=null && temp.Count>0 ? temp[0] : null ; 
Console.WriteLine(valueVariable); 

は時間のコンパイルエラーになります。私たちは、同じことが第一の例のために働いたが、我々は、ここでは、鋳造に必要なのはなぜint?

// Working Snippet with int? casting 
int? valueVariable = temp!=null && temp.Count > 0 ? (int?) temp[0] : null ; 

https://dotnetfiddle.net/0x7ckL

にキャストする必要があり、この問題を解決するために

+4

最初のケースでは、プリミティブ型を参照型に移動しているためです。 2番目のケースでは逆のことをしています。参照型を要求されたプリミティブ値に直接変換することはできません。 –

+1

ここには参照型はありません。 'null'は型を持たず、参照型を伴わずにnull値型の良いデフォルト値です。 –

答えて

1

なぜなら、3進演算子は両方のブランチでSAMEタイプを使用する必要があるからです。 trueとfalseの戻り値はintでなければならないのですか?またはint。 2つの異なるタイプを使用することはできません。

+0

これは正しくありません。 2つのブランチは同じ型を持つ必要はありませんが、そうでない場合はどちらの方向にも明示的な変換が可能でなければなりません。 'null'は特定の型を持たないので、そのような変換は利用できません。これがコンパイラがコンパイルを拒否する理由です。 '?を使うのはいいですか? intVal:nullableIntVal'は同じ型ではありません。 –

+0

もっと具体的な答えをありがとう! – Divisadero

関連する問題