8

小さな問題。なぜこれが機能しないのか、アイデアはありますか?

int? nullableIntVal = (this.Policy == null) ? null : 1;

null左側の式がTrueの場合、それ以外の場合は戻ります1。単純に見えますが、コンパイルエラーが発生します。

nullとの間には暗黙の変換がないため、条件式の型を判別できませんint

nullin? null : 1を有効なものに置き換えればint、問題はありません。

4

5 に答える 5

21

はい-コンパイラは条件式に適切な型を見つけることができません。あなたがそれをに割り当てているという事実を無視してください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は条件式のタイプです。

  • そうしないと、式の種類を判別できず、コンパイル時エラーが発生します。

于 2010-05-21T10:50:04.860 に答える
4

これを試して:

int? nullableIntVal = (this.Policy == null) ? (int?) null : 1; 
于 2010-05-21T10:47:52.977 に答える
2

多分あなたは試すことができます:

default( int? );

nullの代わりに

于 2010-05-21T10:48:47.197 に答える
1

これは機能します:int? nullableIntVal = (this.Policy == null) ? null : (int?)1;

理由(コメントからコピー):

エラーメッセージは、?:演算子(nullおよび1)の2つのブランチに互換性のあるタイプがないためです。新しいソリューションのブランチ(nullとを使用(int?)1)はそうします。

于 2010-05-21T10:47:44.037 に答える
1

int?i =(true?new int?():1);

于 2010-05-21T10:51:37.443 に答える