我在MSDN上看过:
null关键字是表示空引用的文字,不引用任何对象.
但我看到以下代码运行时没有抛出任何异常:
int? i = null; var s = i.ToString();
因此,如果变量i
为null,为什么我可以执行它的方法?
因为int?
实际上是a Nullable
并且Nullable
是a struct
,并且结构不能为null.
这是Nullable类型的工作方式.它们不是引用值,因此它们不能为null,但是当它们被认为等效于null时,它们可以具有状态.
你可以得到更多的细节Nullable
落实在如何在.NET中的引擎盖下实现的可空类型?和Nullable
虽然@JeppeStigNielsen指出有一个案例,你可以得到一个NRE:
但是:当装箱到引用类型时,Nullable <>的特殊处理确保我们获得真正的空引用.因此,例如i.GetType()与问题中的i将会爆发NullReferenceException.这是因为此方法是在对象上定义的而不是可覆盖的
您粘贴的代码
int? i = null;
实际上只是一个简写
int? i = new int?();
这是一个简写
Nullablei = new Nullable ();
分配null是使用隐式运算符,您可以从此处MSDN中读取更多内容.