C# 如何在int上执行方法?是否设置为null而不包含NullReferenceException?
我在MSDN上读到: null关键字是一个表示null引用的文本,一个 它不涉及任何对象 但我看到以下代码运行时没有引发任何异常:C# 如何在int上执行方法?是否设置为null而不包含NullReferenceException?,c#,nullable,C#,Nullable,我在MSDN上读到: null关键字是一个表示null引用的文本,一个 它不涉及任何对象 但我看到以下代码运行时没有引发任何异常: int? i = null; var s = i.ToString(); 因此,如果变量i为null,为什么我可以执行它的方法 因为int?实际上是一个可空的,是一个结构,也是一个结构 这就是为什么它们不是引用值,所以它们不能为null,但是当它们被认为等价于null时,它们可以有一个状态 您可以在和中获得有关Nullable实现的更多详细信息 尽管@Jeppe
int? i = null;
var s = i.ToString();
因此,如果变量
i
为null,为什么我可以执行它的方法 因为int?
实际上是一个可空的
,是一个结构
,也是一个结构
这就是为什么它们不是引用值,所以它们不能为null,但是当它们被认为等价于null时,它们可以有一个状态
您可以在和中获得有关Nullable
实现的更多详细信息
尽管@JeppeStigNielsen指出,有一种情况下,您可以获得NRE:
但是:当装箱到引用类型时,对 Nullable确保我们得到一个真正的null引用。比如说 i、 在问题中使用i的GetType()将使用 NullReferenceException。这是因为此方法是在上定义的 对象,并且不可重写 您粘贴的代码
int? i = null;
实际上只是一个缩写
int? i = new int?();
这是
Nullable<int> i = new Nullable<int>();
Nullable i=new Nullable();
赋值null使用隐式运算符,您可以从这里了解更多信息。仔细想想,您必须能够调用
i.HasValue
来确定它是否为null……如果不总是存在实例,您将如何执行此操作。在这种特定情况下,您可以始终检查.net源代码:public override string ToString(){return HasValue?value.ToString():“”;}
如果您查看文档,它会提到当HasValue
为false时,您会得到一个空字符串。但是为什么在调试器变量中我显示为null?@BudaGavril,因为调试器知道Nullable
类型,当它没有值时会稍微作弊使它看起来null。@BudaGavril这不是一个bug,因为在将变量设置为null后,通常会看到这样的结果。虽然,也许,以某种方式指出这样的null
不是该词真正意义上的null
,这会减少误导性。但是:当装箱到引用类型时,对null
的特殊处理确保我们得到真正的null引用。因此,例如问题中的i.GetType()
和i
将与NullReferenceException
一起爆炸。这是因为此方法是在对象上定义的,不可重写。您在哪里找到此方法的?你能给我一个链接吗?“语法T?是Nullable的简写,其中T是一种值类型。这两种形式是可互换的。”分配null不使用该隐式运算符。赋值像int?i=42
可以被认为使用了该隐式运算符。但是,C#将有自己的内置隐式转换,从int
到int?
,因此我认为C#编译器实际上不会“发出”对链接的IL方法的调用。在赋值null的情况下,必须考虑从literalnull
到typeint?
的C#内置隐式转换,以理解其工作原理。