5

私はこのコードの1つのことを理解しようとしています:

Nullable<Int32> x = 5;
Nullable<Int32> y = null;
Console.WriteLine("x: HasValue={0}, Value={1}",  x.HasValue, x.Value);
Console.WriteLine("y: HasValue={0}, Value={1}",  y.HasValue, y.GetValueOrDefault());

そして出力は次のとおりです。

x: HasValue=True, Value=5
y: HasValue=False, Value=0

nullそして、あなたがに渡すときに私が理解していないことyは、それが呼び出すと信じていますが、このメソッドの定義は割り当てられpublic static implicit operator Nullable<T>(T value)た新しい構造体の受け渡しを初期化しますが、コンストラクターメソッドはそれがnullかどうかをチェックしないので、に割り当てることができます。valuenulldefault(T)value

どうしてここで構造体にnullを割り当てることができ、それはうまく機能するのでしょうか?

私がここで見逃しているものを皆さんに教えていただけますか?どうやってバイパスnullしてデフォルト値を返したのかわかりません。

null許容コードの内部定義:

http://codepaste.net/gtce6d

4

4 に答える 4

6

public static implicit operator Nullable(T value) を呼び出すと信じています

いいえ、そうではありません。この場合Tはであり、 ではないからです。変数のデフォルトのままにします。つまり、構造体の場合、すべてのバイトは. これにより、を返すを持つ構造体が生成されます。Int32nullInt32y0HasValuefalse

実際には構造体に渡すことはできませんnullが、C# コンパイラはこれをデフォルトの初期化に変換しています。

于 2012-06-03T01:15:20.340 に答える
1

デフォルトは、new Nullable<T>(value);(40行目)によって呼び出されるコンストラクターで割り当てられます。

于 2012-06-03T01:05:24.847 に答える
1

ANullable<T>は、値があるかどうかを示すブールフィールドと、(最初のフィールドが true の場合) その値が何であるかを示すフィールドを持つ単純な構造です。構造体を に設定することは実際には不可能nullであり、aNullable<T>も例外ではありません。代わりに、コンパイラは a を設定する要求を、「値を持つ」フィールド ( property に反映される) を false に設定し、「実際の値」フィールド ( property に反映される) をそのタイプのデフォルトに設定Nullable<T>する要求として変換します。nullHasValueValue

Nullable<T>個人的には、 whereHasValueが falseであるというふりをするのはnull、役立つというよりも混乱を招くと思いますが、私は Microsoft ではありません。Nullable<T>各タイプに static プロパティを持たせた方が便利だったと思いますNullable<T>.Null(これは と同等ですdefault(Nullable<T>)が、 の動作Nullable<T>は十分に確立されており、変更されることはないと思います。

于 2012-06-04T03:12:08.863 に答える
1

私の推測ではnull、nullable に割り当てると、デフォルトのコンストラクターが呼び出されます。hasValueそれがが 残る唯一 の 方法 ですfalse.

于 2012-06-03T01:20:19.733 に答える