对Nullable执行隐式结构转换

本文关键字:结构 转换 执行 Nullable struct | 更新日期: 2023-09-27 18:19:05

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

option = NULL

然而,编译器似乎优先处理Nullable的内部Guid类型,并且它试图执行隐式转换,这会抛出一个NRE,因为id参数明显为空。

这是bug还是设计?

可以使用空合并操作符和显式空值来固定:

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

但是这看起来很奇怪。Resharper甚至会淡出它,暗示它是不必要的,并声明:

"? ?右操作数总是null

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

因为你有一个MyId类型的变量,而不是Guid?你把那个变量赋值给Guid?MyId类型有一个隐式转换操作符。如果您将其设置为EXPLICIT,那么编译器可能会抱怨没有转换。将一个空的Foo类实例赋值给Guid会发生什么?变量?你真的希望这有意义吗?——