4

次のコードが機能しないのはなぜだろうと思っていました(agenull許容に設定したことに注意してください)。

myEmployee.age = conditionMet ? someNumber : null;

ただし、以下は正常に機能します。

if(conditionMet)
{
    myEmployee.age = someNumber;
}
else
{
    myEmployee.age = null;
}

条件演算子で値をnullに設定できないのはなぜですか?if私のコードのこれらすべてのステートメントは良くありません。

ありがとう。

4

4 に答える 4

18

両側のタイプは同じである必要があります(または暗黙的に変換可能である必要があります)。

myEmployee.age = conditionMet ? someNumber : (int?)null;

ドキュメントから:

first_expressionとsecond_expressionのタイプが同じであるか、あるタイプから別のタイプへの暗黙的な変換が存在する必要があります。

于 2012-04-23T15:13:58.887 に答える
8

null次のように解釈する必要があるタイプについて明確にすることができます。

myEmployee.age = conditionMet ? someNumber : (int?)null; 
于 2012-04-23T15:14:02.073 に答える
2

ドキュメントの内容を見てください。

[MSDN] null許容型変数のデフォルト値は、HasValueをfalseに設定します。値は未定義です。

したがって、デフォルトはですnull。つまり、次のことが簡単にできます。

if (conditionMet)
    myEmployee.age = someNumber;

これ以上あいまいなコード構文は必要ありません。


必要に応じてnull、事前に初期化できます。デフォルトではなかった場合は、次のようになります。

myEmployee.age = null;

if (conditionMet)
    myEmployee.age = someNumber;
于 2012-04-23T15:16:07.427 に答える
0

三項ステートメントの部分のタイプは、暗黙的に共通ベースにキャスト可能である必要があります。intとの場合、そうでnullはありません。これを解決するにageは、Nullable<int>(またはint?)を作成してにキャストsomeNumberint?ます。

null明確にするために編集:適切なキャストを使用して、3項ステートメントで値をに設定できます。ここでの問題はnull、3項ステートメントで値を設定しようとしていることではありません。三項ステートメントに含まれる2つの式のコンパイラーによって推測される戻り型は、共通の基本型に暗黙的にキャストすることはできません。

于 2012-04-23T15:16:30.820 に答える