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

Mig*_*lla 2 .net c# parameters optional-parameters compile-time

如果我键入以下内容:

public Response GetArticles(string Filter = String.Empty)
{
    //Body
}
Run Code Online (Sandbox Code Playgroud)

Visual Studio给了我这个错误:

"Filter"的默认参数值必须是编译时常量

如果我改为String.Empty经典,""它就是固定的.

但我仍然对这个String.Empty及其行为的错误感到好奇.

Tim*_*ter 9

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

因为"Filter'的默认参数值必须是编译时常量".而String.Empty不是一个常数,而是只static readonly.字符串文字就像"Foo"常量一样作为实现细节(我还没有找到文档).

进一步阅读:为什么String.Empty不是常量?

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

readonly关键字与const关键字不同.const字段只能在字段声明时初始化.可以在声明或构造函数中初始化只读字段.因此,readonly字段可以具有不同的值,具体取决于所使用的构造函数.此外,虽然const字段是编译时常量,但readonly字段可用于运行时常量

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

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

  • 一个恒定的表达
  • 表达式为新的ValType(),其中ValType是值类型,例如枚举或结构
  • 形式为default(ValType)的表达式,其中ValType是值类型.

我很惊讶您可以使用new ValType(),ValType值类型或结构在哪里.我不知道你可以使用默认构造函数,new DateTime()但不是new DateTime(2015,1,15).从我自己的答案中学到了一些新东西.