6

C#のnull合体演算子(??)について次のように理解しています。

int? input = -10;
int result = input ?? 10;//Case - I
//is same as:
int result = input == null? input : 10; // Case - II

一方、定義と使用法では、ケースIとケースIIは同じです。

Case-Iでコンパイラが暗黙的にintをキャストできるのを見るのは驚くべきことですか?Case-IIの場合、intにエラーが表示されます:'エラー1暗黙的に型'intを変換できませんか?' 'int'へ"

null合体演算子について私が見逃しているのは何ですか?

ご関心をお寄せいただきありがとうございます。

4

4 に答える 4

5

2番目のケースを三項演算子で機能させるには、次を使用できます。

int result = input != null ? input.Value : 10;

タイプのValueプロパティは値(この場合は)をNullable<T>返します。Tint

別のオプションは使用することNullable<T>.HasValueです:

int result = input.HasValue ? input.Value : 10;

コンストラクトは、上記の呼び出しのmyNullableInt != null構文糖衣のみです。HasValue

于 2012-01-17T16:36:51.797 に答える
5

null合体演算子で観察されたこの動作??は、文書化された言語機能です。詳細については、C#4.0言語仕様のセクション7.13を参照してください。

式のタイプa?? bは、オペランドで使用可能な暗黙の変換によって異なります。優先順に、??のタイプ bはA0、A、またはBです。ここで、Aはaの型(aに型がある場合)、Bはbの型(bに型がある場合)、A0はAの場合のAの基になる型です。 null許容型、またはそれ以外の場合はAです。具体的には、?? bは次のように処理されます。

  • Aが存在し、null許容型または参照型でない場合、コンパイル時エラーが発生します。

  • bが動的式の場合、結果タイプは動的です。実行時に、aが最初に評価されます。aがnullでない場合、aは動的に変換され、これが結果になります。それ以外の場合、bが評価され、これが結果になります。

  • それ以外の場合、Aが存在し、null許容型であり、bからA0への暗黙の変換が存在する場合、結果の型はA0になります。実行時に、aが最初に評価されます。aがnullでない場合、aはタイプA0にラップ解除され、これが結果になります。それ以外の場合、bが評価され、タイプA0に変換され、これが結果になります。

  • それ以外の場合、Aが存在し、bからAへの暗黙の変換が存在する場合、結果タイプはAです。実行時に、aが最初に評価されます。aがnullでない場合、aが結果になります。それ以外の場合、bが評価され、タイプAに変換され、これが結果になります。

  • それ以外の場合、bのタイプがBで、aからBへの暗黙の変換が存在する場合、結果のタイプはBです。実行時に、aが最初に評価されます。aがnullでない場合、aはタイプA0にアンラップされ(Aが存在し、null可能である場合)、タイプBに変換され、これが結果になります。それ以外の場合、bが評価され、結果になります。

  • そうしないと、aとbに互換性がなくなり、コンパイル時エラーが発生します。

a ? b : c条件演算子の動作が異なる理由については、セクション7.14を参照してください。

仕様をダウンロードして、両方を完全に読んでください。

于 2012-01-17T16:38:32.273 に答える
0
int result = input == null ? input : 10;

あなたは2番目のケースであなたの状態を混ぜ合わせました-あなたはおそらく意味しました

int result = input != null ? input : 10;

三項演算子で使用されている両方の型は完全に同一である必要があるため(そしてと同じでint?はないためint)、これはコンパイルされません-解決策として単純なキャストを使用できます:

int result = input != null ? (int)input : 10;
于 2012-01-17T16:40:26.793 に答える
-1

より簡潔な外植:

int? NULL_Int = 1;
int NORM_Int = 2;

NULL_Int = NORM_Int;  // OK

NORM_Int = NULL_Int;  // NO, you can't assign a null to an int
于 2012-01-17T16:44:05.247 に答える