针对 Nullable<struct> 执行到结构的隐式转换

Implicit conversion to struct executes against Nullable<struct>

给定一个 class 和一个到 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。 IE。获取控制台输出:

optionalId = NULL

然而,编译器似乎优先考虑 Nullable 的内部 Guid 类型,并尝试执行隐式转换,这会抛出 NRE,因为 id 参数显然为 null。

这是错误还是设计使然?

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

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

但这似乎很奇怪。 Resharper 甚至将它淡出,暗示它是不必要的,并指出:

'??' right operand is always null

因为您有一个 MyId 类型的变量,而不是 Guid 类型的变量?并且您将该变量分配给 Guid?并且 MyId 类型具有 IMPLICIT 转换运算符。如果您将其设置为 EXPLICIT,那么编译器可能会抱怨没有转换。通过将空 Foo class 实例分配给 Guid,您究竟希望发生什么?多变的?你真的希望这有意义吗? –