我想说:
public void Problem(Guid optional = Guid.Empty) { }
但是编译器抱怨 Guid.Empty 不是编译时间常数。
由于我不想更改我可以使用的 API:
Nullable<Guid>
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例如,而是等于调用默认构造函数。
null
这意味着:
public void Problem(Guid optional = default(Guid)) { // when called without parameters this will be true var guidIsEmpty = optional == Guid.Empty; }
它与原始示例完全相同。
Guid.Empty
您收到错误的原因是因为Empty定义为:
Empty
public static readonly Guid Empty;
所以,它是一个变量,而不是一个常量(定义为static readonlynot as const)。编译器只能将编译器已知的值作为方法参数的默认值(不是运行时已知的)。
static readonly
const
根本原因是你不能拥有 a constof any struct,不像enum例如。如果您尝试它,它将无法编译。
struct
enum
原因再次是它struct不是原始类型。 有关 .NET 中所有原始类型的列表,请参阅http://msdn.microsoft.com/en- gb/library/system.typecode.aspx (请注意,enum通常继承int,这是一个原始类型)
int
我并不是说它需要一个常数。它需要一些可以在编译时决定的东西。Empty是一个字段,因此,它的值在编译时是未知的(仅在运行时开始时)。
默认参数值必须在编译时知道,它可以是一个 const值,或者使用 C# 功能定义的东西,该功能在编译时知道值,例如default(Guid)or new Guid()(这是在structs 的编译时决定的,因为您不能struct在代码)。
虽然您可以提供default或new轻松提供,但您不能提供 a const(因为它不是原始类型或enum如上所述)。所以,再一次,并不是说可选参数本身需要一个常量,而是编译器已知的值。
default
new