我知道有Guid?
和Nullable<Guid>
这样的东西。我有这段代码,它可以编译:
public Contact GetContact(Guid contactId)
{
if (contactId == null)
{
throw new ArgumentNullException(nameof(contactId));
}
return _communicationsDbContext.Set<Contact>().Find(contactId);
}
"contactId == null"可以是真的吗?
System.Guid 是一个结构体,它不能为 null,因为它不是引用类型。我相信对于实现自定义相等运算符(例如 int、Guid 等)的已知struct
类型,编译器会将空比较替换为 false。(因此,整个比较和抛出语句将消失)
对于未实现自定义相等运算符的struct
类型,代码根本无法编译。
尽管如此,这是不必要的。
请参阅: https://sharplab.io/#v2:EYLgtghgzgLgpgJwDQxASwDYB8ACAGAAhwEYBuAWACgcBmIgJgIGECBvKgzounAFgICyACgDiAVzQATAgHMJkgJRsOXVWgBmBIXKkEAvHoIA7MRgxKYACwQB7AO7G4DgIII5YOEZgA5UxgCiAB4AxnAADjBoNkZCChSUqgC+VIlAA===
public void M(Guid guid)
{
if (guid == null) throw new ArgumentNullException();
}
将被编译为:
// Methods
.method public hidebysig
instance void M (
valuetype [mscorlib]System.Guid guid
) cil managed
{
// Method begins at RVA 0x2050
// Code size 1 (0x1)
.maxstack 8
IL_0000: ret
} // end of method C::M
如您所见,该方法中的第一条指令是 return。
System.Guid
是一个struct
,结构永远不能null
。
相反,您可能希望检查它是否不是"零"Guid:
x != Guid.Empty
Guid 是一种值类型,因此它不能为 null。一种检查方法是:
if (contactId == Guid.Empty)
或
contactId == default(Guid)