C# 如何在int上执行方法?是否设置为null而不包含NullReferenceException?

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

我在MSDN上读到:

null关键字是一个表示null引用的文本,一个 它不涉及任何对象

但我看到以下代码运行时没有引发任何异常:

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的情况下,必须考虑从literal
null
到type
int?
的C#内置隐式转换,以理解其工作原理。