小さな問題。なぜこれが機能しないのか、アイデアはありますか?
int? nullableIntVal = (this.Policy == null) ? null : 1;
null
左側の式がTrueの場合、それ以外の場合は戻ります1
。単純に見えますが、コンパイルエラーが発生します。
null
との間には暗黙の変換がないため、条件式の型を判別できませんint
。
null
in? null : 1
を有効なものに置き換えればint
、問題はありません。
小さな問題。なぜこれが機能しないのか、アイデアはありますか?
int? nullableIntVal = (this.Policy == null) ? null : 1;
null
左側の式がTrueの場合、それ以外の場合は戻ります1
。単純に見えますが、コンパイルエラーが発生します。
null
との間には暗黙の変換がないため、条件式の型を判別できませんint
。
null
in? null : 1
を有効なものに置き換えればint
、問題はありません。
はい-コンパイラは条件式に適切な型を見つけることができません。あなたがそれをに割り当てているという事実を無視してくださいint?
-コンパイラはその情報を使用しません。したがって、式は次のとおりです。
(this.Policy == null) ? null : 1;
この表現のタイプは何ですか?言語仕様では、第2オペランドのタイプまたは第3オペランドのタイプのいずれかである必要があると規定されています。null
タイプがないため、int
(第3オペランドのタイプ)である必要がありますが、からnull
への変換がないint
ため、失敗します。
いずれかのオペランドをにキャストするint?
と、それが機能するか、null値を表す別の方法を使用します-したがって、これらのいずれか:
(this.Policy == null) ? (int?) null : 1;
(this.Policy == null) ? null : (int?) 1;
(this.Policy == null) ? default(int?) : 1;
(this.Policy == null) ? new int?() : 1;
私はあなたがこれをしなければならないのは少し苦痛だと同意します。
C#3.0言語仕様セクション7.13から:
?:演算子の2番目と3番目のオペランドは、条件式のタイプを制御します。XとYを2番目と3番目のオペランドのタイプとします。それで、
XとYが同じ型の場合、これは条件式の型です。
それ以外の場合、暗黙の変換(§6.1)がXからYに存在するが、YからXには存在しない場合、Yは条件式のタイプです。
それ以外の場合、暗黙の変換(§6.1)がYからXに存在するが、XからYには存在しない場合、Xは条件式のタイプです。
そうしないと、式の種類を判別できず、コンパイル時エラーが発生します。
これを試して:
int? nullableIntVal = (this.Policy == null) ? (int?) null : 1;
多分あなたは試すことができます:
default( int? );
nullの代わりに
これは機能します:int? nullableIntVal = (this.Policy == null) ? null : (int?)1;
。
理由(コメントからコピー):
エラーメッセージは、?:
演算子(null
および1
)の2つのブランチに互換性のあるタイプがないためです。新しいソリューションのブランチ(null
とを使用(int?)1
)はそうします。
int?i =(true?new int?():1);