为什么.ToString()在空字符串上会导致空错误,当.ToString()在具有空值的可空int上正常工作?

Cpt*_*rkt 69 c# string int null nullable

selectedItem 有两个领域:

  • int? _cost
  • string _serialNumber

在这个例子中,_cost_serialNumberselectedItem都是空.我正在阅读通过selectedItem他们的属性的字段,并填写文本框与他们的值,当...

TextBox1.Text = selectedItem.Cost.ToString(); //no error
TextBox2.Text = selectedItem.SerialNumber.ToString(); //error
Run Code Online (Sandbox Code Playgroud)

我明白这SerialNumber.ToString()是多余的(因为它已经是一个字符串),但我不明白为什么这会导致这个异常:

可以为空的对象必须具有值.

  • int? _cost 可以为空,并且没有值,但它没有给我例外.
  • string _serialNumber可以为空,并且没有值,但它确实给了我例外.

这个问题触及它,这家伙基本上是在问同样的事情,但是没有指定的答案,而且它也没有解释为什么可以为空int?例如,我可以.ToString()在可空的int上使用但不能在空字符串上使用吗?

Joh*_*y_D 89

因为string类型null确实没有任何意义,所以内存中没有任何对象.
但是int?即使值设置为null仍然指向某个对象,也要键入(可为空).
如果您阅读Jeffrey Richter的"CLR via C#",您会发现可空类型只是具有一些封装逻辑的常见类型的外观类,以便更方便地使用DB null.

检查msdn以了解可空类型.

  • 所以基本上因为它实际上不是空的,它只是假装? (8认同)
  • 是的,基本上它是一个围绕int字段和布尔符号的结构,指示此结构是设置为int值还是仍然是unitialized,这意味着null.在[this](http://stackoverflow.com/questions/2503811/how-are-nullable-types-implemented-under-the-hood-in-net)主题Mark Gravell粘贴`Nullable <T>`类型的实现. (3认同)
  • 这一切都是正确的,但是请注意`如果`Cost`为`int?`类型为null,`selectedItem.Cost.GetType()`*将抛出.不同之处在于`ToString`是一个被`Nullable <T>`覆盖的虚方法,因此可以直接在`int?`上调用.另一方面,`GetType`是在`Nullable <T>`的基类上声明的非虚方法(实际上在`object`上).因此,运行时必须将`Nullable <>`转换为该类类型才能调用`GetType`,这就是所谓的**boxing**,但是`Nullable <>`有特殊的装箱规则,所以a生成空引用. (3认同)

Han*_*ing 32

A Nullable<int>是a struct,实际上不能为空.因此,对"null"结构的方法调用仍然有效.

有一些"编译器魔术"可以_cost == null生成有效的表达式.

  • @PeteBaughman:编译魔术,我相信. (12认同)
  • 这是编译器的魔力.使用普通的C#代码(即运算符重载)添加从"null"到"Nullable <T>"的隐式转换将要求您能够从表达式"`null"中推断出一种类型,您不能,它没有一个.编译器实质上将`Nullable <T> foo = null`变为`Nullable <T> foo = default(Nullable <T>)`和`foo == null`变成`!foo.HasValue`. (4认同)
  • 它"编译魔术"还是运算符重载? (2认同)

Asi*_*taq 14

int?实际上它本身并不是一个对象,但它是一个Nullable<int>对象.

所以,当你宣布int? _Cost,你实际上是宣布Nullable<int> _Cost和财产_Cost.Valueundefined不是_Cost对象本身.

它实际上是一个语法糖使用non nullable类型,如int,booldecimal容易.

根据MSDN:

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

  • @AlexBrault:`_Cost`实际上不能是'null`,因为它不是引用类型. (3认同)