为什么 String.Empty 是无效的默认参数?

Why is String.Empty an invalid default parameter?

如果我输入以下内容:

public Response GetArticles(string Filter = String.Empty)
{
    //Body
}

Visual Studio 给我这个错误:

Default parameter value for 'Filter' must be a compile-time constant

如果我将 String.Empty 更改为经典 "",它就固定了。

但我仍然很好奇 String.Empty 及其行为有什么问题。

Why is String.Empty an invalid default parameter?

因为"Default parameter value for 'Filter' must be a compile-time constant"。并且 String.Empty 不是常数而只是 static readonly。像 "Foo" 这样的字符串文字是作为实现细节的常量(我还没有找到文档)。

进一步阅读:Why isn't String.Empty a constant?

引用自 C# 语言规范的 10.4 常量:

The readonly keyword is different from the const keyword. A const field can only be initialized at the declaration of the field. A readonly field can be initialized either at the declaration or in a constructor. Therefore, readonly fields can have different values depending on the constructor used. Also, while a const field is a compile-time constant, the readonly field can be used for runtime constants

这里是根据可选参数MSDN引用:

默认值必须是以下表达式类型之一:

  • 常量表达式
  • new ValType() 形式的表达式,其中 ValType 是值类型,例如枚举或结构
  • default(ValType) 形式的表达式,其中 ValType 是值类型。

我很惊讶您可以使用 new ValType(),其中 ValType 是值类型或结构。我不知道您可以使用 new DateTime() 而不是 new DateTime(2015,1,15) 这样的默认构造函数。从我自己的回答中学到了一些新东西。

string.Empty 不是编译时常量。例如,您可以使用 Reflection 更改它的值。但是 "" 空字符串文字是常量,它的值在编译时是已知的,所以这就是它有效的原因。