针对 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,您究竟希望发生什么?多变的?你真的希望这有意义吗? –
给定一个 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,您究竟希望发生什么?多变的?你真的希望这有意义吗? –