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