回答:
スペック(§7.14)は、条件式のためと言うb ? x : yのいずれかで、三台の可能性があるxとyの両方のタイプを持っていると、特定の良好な条件が満たされている、のいずれか一方のみxとyタイプ有すると特定の良好な条件が満たされて、コンパイル時エラーを発生します。ここで、「特定の良好な状態」とは、特定の変換が可能であることを意味します。これについては、以下で詳しく説明します。
さて、仕様の関連部分に移りましょう:
唯一の場合の1
xとy種類があり、両方xとyその型に暗黙的に変換され、その条件式のタイプです。
ここでの問題は、
int? number = true ? 5 : null;
条件付き結果の1つだけにタイプがあります。ここxでintリテラル、そしてyあるnullんどのないタイプを持っているとnull暗黙的に変換可能ではありませんint1。そのため、「特定の良好な条件」が満たされず、コンパイル時エラーが発生します。
これを回避するには 2つの方法があります。
int? number = true ? (int?)5 : null;
ここでは、xとのいずれか1つのみが存在する場合を示しyます。ことを注意null まだ型がありませんまだ、コンパイラはのでこれですべての問題を持っていない(int?)5とnullの両方に暗黙的に変換されているint?(§6.1.4および§6.1.5)。
他の方法は明らかに:
int? number = true ? 5 : (int?)null;
しかし今度は、これが大丈夫な理由を理解するために、仕様の別の節を読む必要があります。
場合は
x型を持つXとy種類がありY、その後
暗黙の変換(§6.1)がより存在する場合
XにY、ではないからYのX、次にY条件式のタイプがあります。暗黙の変換(§6.1)がより存在する場合
YにX、ではないからXのY、次にX条件式のタイプがあります。そうしないと、式のタイプを判別できず、コンパイル時エラーが発生します。
これxはのタイプでint、yのタイプint?です。以下からの暗黙の変換がないint?のはint、しかしからの暗黙的な変換があるintとint?式の型があるようにint?。
1:条件式のタイプを決定する際に左側のタイプが無視されることに注意してください。これは、ここでよくある混乱の原因です。
new int?()代わりです(int?)null。
DateTime、実際に必要なときにデータをにキャストしようとした場合にも当てはまります(DateTime?)
null 識別可能なタイプはありません-それを幸せにするために少しプロディングが必要です:
int? number = true ? 5 : (int?)null;
int? number = true ? 5 : null as int?;
int? number = true ? 5 : (int?)null;とint? number = true ? (int?)5 : null;両方がコンパイルされることです!! スクラッチ、スクラッチ
他の人が述べたように、5はでありint、null暗黙的にに変換することはできませんint。
この問題を回避する他の方法は次のとおりです。
int? num = true ? 5 : default(int?);
int? num = true ? 5 : new int?();
int? num = true ? 5 : null as int?;
int? num = true ? 5 : (int?)null;
int? num = true ? (int?)5 : null;
int? num = true ? 5 as int? : null;
int? num = true ? new int?(5) : null;
また、どこにいてint?も使用できますNullable<int>。
ではC# 9、この今許可されているブログ
ターゲットが入力されましたか?と?
時々条件付き?and?:式には、ブランチ間で明らかな共有型がありません。このようなケースは今日失敗しますが、C#9.0は、両方のブランチが変換するターゲットタイプがある場合、それらを許可します。
Person person = student ?? customer; // Shared base type
int? result = b ? 0 : null; // nullable value type
またはあなたの例:
// Allowed in C# 9.
int? number = true ? 5 : null;