回答:
スペック(§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
暗黙的に変換可能ではありませんint
1。そのため、「特定の良好な条件」が満たされず、コンパイル時エラーが発生します。
これを回避するには 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;