others - 为什么在空字符串上使用ToString()会导致空错误,当值为空时,ToString()在可以空的int上工作?

selectedItem有两个字段:

  • int? _cost
  • string _serialNumber

在这个例子中,selectedItem_cost_serialNumber都是空的,


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

Nullable object must have a value .

  • int? _cost可为空值,并且没有值,但是它没有给出异常,
  • string _serialNumber可为空值,并且没有值,但是它给出了异常,

例如,可以在可空的int上使用.ToString(),但不能在空字符串上使用?

时间:

因为类型的stringnull 实际上指向什么,所以内存中没有任何对象。
int? type(nullable) 即使值为 null 仍然指向某些对象。
Jeffrey"通过 C#的richter的clr"如果你读你会发现可空类型只是外观类常见一些incapsulated逻辑为了使用db零更方便。

检查 msdn 以了解可以为空的类型。

Nullable<int>是一个struct,不能真正为空,因此,"null"结构上的方法仍然可以调用。

有一些"编译器魔术"使_cost == null成为一个有效的表达式。

int?实际上不是一个对象,它是一个Nullable

因此声明int? _Cost时,实际上是声明Nullable<int> _Cost_Cost.Value的属性是undefined本身,而不是_Cost对象本身。

它实际上是使用intbooldecimalnon nullable类型的语法糖。

根据MSDN

语法T?System.Nullable<T>的shorthand,其中T是值类型,这两种形式是可互换的。

字符串是引用类型,但int是值类型。下面是对差异的一个很好的讨论http://www.albahari.com/valuevsreftypes.aspx

可以空值实际上是公开两个属性的结构: HasValue和值。如果你这样做,你将得到错误:


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

为了检查你的int? 有一个可以访问 i.HasValue的值

我认为原因是,当编译器遇到原始数据类型时,它将它包装到相应的对象中。 toString() 方法调用只是一个间接调用( 包装,然后调用该方法),在那里处理异常。 在字符串的情况下,我们直接调用方法。 当指向空时,方法抛出异常。


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

yiels错误,因为它是调用函数 ToString(),它是 System.String的成员。 这里函数返回 System.String;的这里实例不执行实际转换。 另外,字符串是引用类型。 "引用类型"包含指向存储数据的其他内存位置的指针。


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

没有产生错误,因为它正在调用函数 ToString(),它是 System.Integer 的成员。 这里函数将这里实例的数值转换为它的等效的字符串表示形式。 同时,整数是一个值类型。 数据类型是一个值类型,如果它持有自己的内存分配中的数据。

相同的函数名 ToString(),但执行不同的任务。

String.ToString 方法

Int32.ToString 方法

值类型和引用类型

原因很简单。int? 或者 Nullable<int> struct还是值类型,零它永远不可能。

那么当我们执行以下操作时:


int? _cost = null;

_cost 将有两个字段 ValueHasValue,当我们将 null 指定给 _cost 时,它的HasValue 标志将被设置为 falseValue 字段将被指定 default(T),以以防万一 int?

现在,当我们在 _cost 上调用 ToString 时,Nullable<T> 具有 ToString的重写定义,如果我们查看提供的microsoft源引用的,则实现如下:


public override string ToString() {
 return HasValue? value.ToString() :"";
 }

因此它返回一个空字符串,因为 _cost 被指定为 null

现在是 string _serialNumber的情况。 string 是引用类型,它可以纯粹 null, 如果持有 null 然后调用 ToString 它会产生期望的空引用异常。

你可以看到:值类型和引用类型- MSDN

...