为什么我不能像这样使用null-coalescing运算符?

时间:2012-09-07 05:08:25

标签: c# .net guid

根据MSDN

  

?? operator被称为null-coalescing运算符并且习惯于   为可空值类型或引用类型定义默认值。

但是当我运行下面的代码时:

Guid test;
Guid otherGuid = test ?? Guid.NewGuid();

我收到错误:

  

运营商'??'不能应用于'System.Guid'类型的操作数   '的System.Guid'

我认为Guid是一种参考类型。那不是这样吗?有人可以向我解释为什么这不起作用吗?

4 个答案:

答案 0 :(得分:7)

Guid不是引用类型,它是值类型,您不能将其指定为null,这就是您无法使用?? <检查它的原因/ p>

以下行会给您错误。

  

无法将null转换为'System.Guid',因为它是不可为空的   值类型

Guid test = null;

您可以使用Nullable

Nullable<Guid> test = null;
Guid otherGuid = test ?? Guid.NewGuid();

或简短形式

Guid? test = null;
Guid otherGuid = test ?? Guid.NewGuid();

答案 1 :(得分:7)

Guid是一个结构而不是一个类,因此不能为空。

要实现这一点,你可以这样做:

Guid? nullableGuid = null;
/* At some point nullableGuid is perhaps assigned... */
Guid otherGuid = nullableGuid ?? Guid.NewGuid();

答案 2 :(得分:3)

GUID是一种结构。 http://msdn.microsoft.com/en-us/library/system.guid.aspx

尝试使用Guid.Empty进行检查。

Guid otherGuid = test == Guid.Empty ? Guid.NewGuid() : test;

答案 3 :(得分:0)

正如其他人所说,Guid 是值类型而不是引用类型,请参阅 here 以获取有关两者之间差异的更深入解释。在您的方案中,您有两种选择。

  1. 合并运算符:
Guid? guid = null;
otherGuid = guid ?? Guid.NewGuid();
  1. default 比较
otherGuid = guid == default ? Guid.NewGuid() : guid;

在第二个选项中,您也可以使用 Guid.Empty,但使用 default 关键字会更好。