C# 对结构的隐式转换针对Nullable执行<;结构>;

C# 对结构的隐式转换针对Nullable执行<;结构>;,c#,null,nullable,implicit-conversion,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; } }

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

class MyId
{
    private readonly Guid innerGuid;

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

    public static implicit operator Guid(MyId id)
    {
        return id.innerGuid;
    }
}
分配给可为空的
时:

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

optionalId=NULL

但是,编译器似乎优先于Nullable的内部Guid类型,并尝试执行隐式转换,当
id
参数明显为null时,该转换会抛出一个NRE

这是一个bug还是出于设计

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

    static void Main(string[] args)
    {
        MyId someId = null;
        Guid? optionalId = someId ?? (Guid?) null;
        Console.WriteLine("optionalId = " + (optionalId.HasValue ? optionalId.Value.ToString() : "NULL"));
    }
但这似乎很奇怪。Resharper甚至会将其淡出,暗示其不必要,并声明:

“??”右操作数始终为空


因为您有一个MyId类型的变量,而不是Guid类型的变量?您要将该变量分配给Guid?MyId类型有一个隐式转换运算符。如果将其显式化,那么编译器可能会抱怨没有转换。通过将null Foo类实例分配给Guid,您希望发生什么?变量你真的认为这是有意义的吗

您是否尝试过
optionald=(MyId)null
查看它是否抛出。当前转换为guid的null显然不会调用接受MyIdIMHO的隐式运算符,您描述的是正确的行为。它正在正确执行隐式运算符。您可以通过向Nullable添加隐式运算符并使用null合并运算符??在这个功能中。或者,更改隐式运算符,您必须返回一个可为null的值。它可能同时适用于Guid和Nullable@Gread.And.power.Oz是的,为
Nullable
重载添加一个隐式运算符可以解决这种情况。不幸的是,我的实际情况并非如此简单(一个通用基类
Identity
,它可以使用Guid、int、string等。向
Nullable
添加隐式转换意味着我必须给
TId
一个结构约束,这意味着我不能再使用Identity)@Gread.And.Powerful.Oz但我想我的重点是,左侧为
Guid?
,右侧为
MyId
。我有一个从
MyId
->
Guid
的隐式转换,但不是
MyId
->
Guid?
,所以当复制null ref是一个完全有效的操作时,为什么它要运行不可为null的转换呢?@Tyson,关于Identity为true,但您可以使用Identity,其中StringWrapper是一个包含字符串的结构。糟透了,我知道。
    static void Main(string[] args)
    {
        MyId someId = null;
        Guid? optionalId = someId ?? (Guid?) null;
        Console.WriteLine("optionalId = " + (optionalId.HasValue ? optionalId.Value.ToString() : "NULL"));
    }