为什么 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
更改它的值。但是 ""
空字符串文字是常量,它的值在编译时是已知的,所以这就是它有效的原因。
如果我输入以下内容:
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
更改它的值。但是 ""
空字符串文字是常量,它的值在编译时是已知的,所以这就是它有效的原因。