隐式转换为struct对Nullable <struct>执行

时间:2015-10-24 01:15:51

标签: c# null nullable implicit-conversion

给定一个具有隐式转换运算符的类Guid

class MyId
{
    private readonly Guid innerGuid;

    public MyId(Guid innerGuid)
    {
        this.innerGuid = innerGuid;
    }

    public static implicit operator Guid(MyId id)
    {
        return id.innerGuid;
    }
}

分配到Nullable<Guid>

    static void Main(string[] args)
    {
        MyId someId = null;
        Guid? optionalId = someId;
        Console.WriteLine("optionalId = " + (optionalId.HasValue ? optionalId.Value.ToString() : "NULL"));
    }

我希望空引用只是从someId传播到optionalId。即。获取控制台输出:

  

optionalId = NULL

然而,编译器似乎优先于Nullable的内部Guid类型,并且它尝试执行隐式转换,由于id参数显然为空,因此会抛出NRE。

这是一个错误还是设计?

可以使用空合并运算符和显式空值来修复:

    static void Main(string[] args)
    {
        MyId someId = null;
        Guid? optionalId = someId ?? (Guid?) null;
        Console.WriteLine("optionalId = " + (optionalId.HasValue ? optionalId.Value.ToString() : "NULL"));
    }

但这似乎很奇怪。 Resharper甚至将其淡化,暗示其不必要和陈述:

  

&#39; ??&#39;右操作数始终为空

1 个答案:

答案 0 :(得分:1)

因为你有一个MyId类型的变量,而不是Guid?并且你将该变量分配给Guid? MyId类型有一个IMPLICIT转换运算符。如果你使它成为EXPLICIT,那么编译器可能会抱怨没有转换。通过将一个null Foo类实例分配给Guid,您期望会发生什么?变量?你真的希望这有意义吗? -