【问题标题】:Why is String.Empty an invalid default parameter?为什么 String.Empty 是无效的默认参数?
【发布时间】:2015-03-18 13:35:33
【问题描述】:

如果我输入以下内容:

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

Visual Studio 给我这个错误:

“过滤器”的默认参数值必须是编译时常量

如果我将String.Empty 更改为经典的"",则它是固定的。

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

【问题讨论】:

标签: c# .net parameters optional-parameters compile-time


【解决方案1】:

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

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

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

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

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

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

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

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

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

【讨论】:

  • 而且 MSDN 并没有说 default(string) 是否是 OP 所追求的答案。如果这有效,它可能无论如何都会是null。哦,好吧。
  • new Valtype() 是允许的,因为结构不能有用户定义的无参数构造函数。它由编译器提供,编译器知道结果将是什么(例如将每个字段设置为其默认值)
  • @Selman22:谢谢,但难道不能写一个在默认构造函数中做奇怪事情的结构吗?我还补充说字符串文字是一个常量。但是,我在 MSDN 或语言规范中没有找到任何文档。
  • 但不能为结构提供无参数构造函数。
【解决方案2】:

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

【讨论】:

  • 这更好地确定了实际问题的答案,因为它更短,但是,嗯,我认为我们这些凡人不应该知道您可以更改 string.empty 的值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2022-11-30
  • 2013-06-16
相关资源
最近更新 更多