引用类型与Nullable类型ToString()

Max*_*ich 21 c# null nullable value-type reference-type

有人可以请你解释为什么调用ToString()一个空的引用类型会导致一个异常(在我看来这是完全合理的,你无法调用任何方法!)但是调用ToString()一个空的Nullable(Of T)返回String.Empty?这对我来说是一个惊喜,因为我认为这种行为在各种类型中都是一致的.

Nullable<Guid> value = null;
Stock stock = null;
string result = value.ToString(); //Returns empty string
string result1 = stock.ToString(); //Causes a NullReferenceException
Run Code Online (Sandbox Code Playgroud)

Ada*_*rth 20

Nullable<T>实际上是一个struct有一些编译器支持和实现支持,表现得像一个null没有实际存在null.

您所看到的是实现之间的冲突,允许您自然地将其null视为任何其他引用类型,但允许方法调用发生,因为Nullable<T>它实际上不为null,其中的值为null.

在视觉上它看起来应该不起作用,这只是因为你无法看到在后台为你做了什么.

当您在空引用类型上调用扩展方法时,可以看到其他此类视觉技巧...调用有效(反对视觉期望),因为在引擎盖下,它被解析为静态方法调用,将您的null实例作为参数传递.

Nullable <T>类型如何在幕后工作?


log*_*cnp 6

Nullable是一个值类型和赋值,null用于使用Value=null和初始化它HasValue=false.

此外,Nullable.ToString()实现如下:

public override string ToString()
{
    if (!this.HasValue)
    {
        return "";
    }
    return this.value.ToString();
}
Run Code Online (Sandbox Code Playgroud)

所以你所看到的是预期的.