【问题标题】:Why can't I use the null-coalescing operator like this?为什么我不能像这样使用空合并运算符?
【发布时间】:2012-08-31 23:29:57
【问题描述】:

根据MSDN

??运算符称为空合并运算符,用于 为可空值类型或引用类型定义一个默认值。

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

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

我得到错误:

运算符'??'不能应用于“System.Guid”类型的操作数和 'System.Guid'

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

【问题讨论】:

    标签: c# .net guid


    【解决方案1】:

    Guid 不是引用类型,它是一个值类型,你不能将它赋值为 null,这就是为什么你不能用 ?? 检查它的原因

    下面的行会给你错误。

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

    Guid test = null;
    

    您可以使用Nullable

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

    或缩写形式

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

    【讨论】:

      【解决方案2】:

      Guid 是结构体而非类,因此不能为空。

      为此,您可以执行以下操作:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

          正如其他人所说,Guid 是值类型而不是引用类型,请参阅here 以更深入地解释两者之间的区别。在你的场景中有两个选项。

          1. 聚结算子:
          Guid? guid = null;
          otherGuid = guid ?? Guid.NewGuid();
          
          1. default比较
          otherGuid = guid == default ? Guid.NewGuid() : guid;
          

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

          【讨论】:

            猜你喜欢
            • 2013-10-21
            • 2014-11-29
            • 1970-01-01
            • 1970-01-01
            • 2017-10-19
            • 2010-10-20
            • 1970-01-01
            • 2020-08-27
            • 1970-01-01
            相关资源
            最近更新 更多