给定一个具有隐式转换运算符的类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;右操作数始终为空
答案 0 :(得分:1)
因为你有一个MyId类型的变量,而不是Guid?并且你将该变量分配给Guid? MyId类型有一个IMPLICIT转换运算符。如果你使它成为EXPLICIT,那么编译器可能会抱怨没有转换。通过将一个null Foo类实例分配给Guid,您期望会发生什么?变量?你真的希望这有意义吗? -