71

selectedItem次の 2 つのフィールドがあります。

  • int? _cost
  • string _serialNumber

この例では、_cost_serialNumberofselectedItemは両方ともヌルです。プロパティを介してフィールドを読み取りselectedItem、テキストボックスに値を入力すると...

TextBox1.Text = selectedItem.Cost.ToString(); //no error
TextBox2.Text = selectedItem.SerialNumber.ToString(); //error

冗長であることは理解してSerialNumber.ToString()いますが(すでに文字列であるため)、これがこの例外を引き起こす理由がわかりません:

Null 許容オブジェクトには値が必要です。

  • int? _costnull可能で、値を持っていませんが、例外は発生しません。
  • string _serialNumbernull可能で、値を持っていませんが例外が発生します。

この質問はそれに触れています。男は本質的に同じことを尋ねていますが、指定された答えはなく、なぜ nullable int? たとえば.ToString()、null 許容 int では使用できますが、null 文字列では使用できませんか?

4

8 に答える 8

91

string型は実際には何も指していないためnull、メモリ内にオブジェクトはありません。
ただしint?、値が設定されていても type(nullable) は、nullまだいくつかのオブジェクトを指しています。
Jeffrey Richter の「CLR via C#」を読むと、null 許容型は、DB null をより便利に操作するためにカプセル化されたロジックを持つ一般的な型の単なるファサード クラスであることがわかります。

Null 許容型については、 msdnを確認してください。

于 2012-07-12T07:25:02.643 に答える
34

ANullable<int>は astructであり、実際には null にすることはできません。そのため、「null」構造体でのメソッド呼び出しは引き続き機能します。

_cost == null有効な式を作成する「コンパイラの魔法」があります。

于 2012-07-12T07:24:05.357 に答える
15

int?それ自体は実際にはオブジェクトではありませんが、Nullable<int>オブジェクトです。

したがって、 を宣言するときint? _Cost、実際には宣言しNullable<int> _Costていて、 のプロパティはオブジェクト自体で_Cost.Valueはありundefinedません。_Cost

、または簡単にnon nullableなどの型を使用するのは、実際には構文糖衣です。intbooldecimal

MSDNによると:

構文T?は の省略形でSystem.Nullable<T>Tは値の型です。2 つの形式は交換可能です。

于 2012-07-12T07:28:35.437 に答える
4

string は参照型ですが、nullable int は値型です。これは、違いに関する良い議論http://www.albahari.com/valuevsreftypes.aspxです。

于 2012-07-12T07:31:07.583 に答える
3

Nullable は実際には、HasValue と Value の 2 つのプロパティを公開する構造体です。これを行うと、エラーが発生します。

int? i = null;
i.Value.ToString()

あなたのintかどうかを確認するには?アクセスできる値があるi.HasValue

于 2012-07-12T07:24:45.977 に答える
1

その理由は、コンパイラがプリミティブデータ型に遭遇すると、それを対応するオブジェクトにラップするためだと思います。toString() メソッド呼び出しは、ここでは単なる間接呼び出し (ラップしてからメソッドを呼び出す) であり、例外はそこで処理されます。String の場合は、メソッドを直接呼び出しています。null を指すと、メソッドは例外をスローします。

于 2012-07-12T07:30:48.840 に答える
0
TextBox2.Text = selectedItem.SerialNumber.ToString(); //error

System.Stringのメンバーである関数ToString()を呼び出しているため、エラーが発生します。この関数は、System.String のこのインスタンスを返します。実際の変換は実行されません。また、String は参照型です。参照型には、データを保持する別のメモリ位置へのポインターが含まれています。

TextBox1.Text = selectedItem.Cost.ToString(); //no error

System.Integerのメンバーである関数ToString()を呼び出しているため、エラーは発生しません 。この関数は、このインスタンスの数値を同等の文字列表現に変換します。また、Integer は値型です。独自のメモリ割り当て内にデータを保持する場合、データ型は値型です。

関数名は同じ ToString() ですが、異なるタスクを実行します。

String.ToString メソッド

Int32.ToString メソッド

値型と参照型

于 2012-07-12T12:05:17.553 に答える