小编典典

如何在 C# 中将参数默认为 Guid.Empty?

all

我想说:

public void Problem(Guid optional = Guid.Empty)
{
}

但是编译器抱怨 Guid.Empty 不是编译时间常数。

由于我不想更改我可以使用的 API:

 Nullable<Guid>

阅读 100

收藏
2022-07-08

共1个答案

小编典典

解决方案

您可以new Guid()改用

public void Problem(Guid optional = new Guid())
{
  // when called without parameters this will be true
  var guidIsEmpty = optional == Guid.Empty;
}

你也可以使用default(Guid)

default(Guid)也将完全一样new Guid()

因为 Guid 是值类型而不是引用类型,所以,default(Guid)不等于null例如,而是等于调用默认构造函数。

这意味着:

public void Problem(Guid optional = default(Guid))
{
  // when called without parameters this will be true
  var guidIsEmpty = optional == Guid.Empty;
}

它与原始示例完全相同。

解释

为什么没有Guid.Empty工作?

您收到错误的原因是因为Empty定义为:

public static readonly Guid Empty;

所以,它是一个变量,而不是一个常量(定义为static readonlynot as
const)。编译器只能将编译器已知的值作为方法参数的默认值(不是运行时已知的)。

根本原因是你不能拥有 a constof any struct,不像enum例如。如果您尝试它,它将无法编译。

原因再次是它struct不是原始类型。
有关 .NET 中所有原始类型的列表,请参阅http://msdn.microsoft.com/en-
gb/library/system.typecode.aspx
(请注意,enum通常继承int,这是一个原始类型)

new Guid()也不是一个常数!

我并不是说它需要一个常数。它需要一些可以在编译时决定的东西。Empty是一个字段,因此,它的值在编译时是未知的(仅在运行时开始时)。

默认参数值必须在编译时知道,它可以是一个 const值,或者使用 C# 功能定义的东西,该功能在编译时知道值,例如default(Guid)or
new Guid()(这是在structs 的编译时决定的,因为您不能struct在代码)。

虽然您可以提供defaultnew轻松提供,但您不能提供 a
const(因为它不是原始类型或enum如上所述)。所以,再一次,并不是说可选参数本身需要一个常量,而是编译器已知的值。

2022-07-08