我知道有Guid?
和Nullable<Guid>
这样的东西。我有这段代码,它可以编译:
public Contact GetContact(Guid contactId)
{
if (contactId == null)
{
throw new ArgumentNullException(nameof(contactId));
}
return _communicationsDbContext.Set<Contact>().Find(contactId);
}
“ contactId == null”可以为真吗?
答案 0 :(得分:2)
System.Guid是一个结构,不能为null,因为它不是引用类型。我相信,对于实现自定义相等运算符的已知struct
类型(例如int,Guid等),编译器会将null比较替换为false。 (因此,整个比较和throw语句将消失)
对于没有实现自定义相等运算符的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
将被编译为:
search
如您所见,方法中的第一条指令是return。
答案 1 :(得分:1)
System.Guid
是struct
,结构永远不能是null
。
相反,您可能希望检查它是否不是“零”引导:
x != Guid.Empty
答案 2 :(得分:0)
Guid是一种值类型,因此它不能为null。一种检查方法是:
if (contactId == Guid.Empty)
或
contactId == default(Guid)