为什么我不能将String.Empty用作默认参数值?

10

今天我正在构造函数中创建一个默认参数值。

public SomeClass (String something = String.Empty)
{
   // ...
}

编译器报错。

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

我原以为String类中的Empty是编译时常量。

.field public static initonly string Empty

我是否误解了编译时常量的意义,还是只是需要接受更多奇怪的东西?


错误信息表明您的印象是“嗯,不完全正确的”。 - Tony Hopkinson
1
更完整的讨论请参见此处:https://dev59.com/o3RB5IYBdhLWcg3wyqOo - Denise Skidmore
3个回答

4
这个 SO 问题的被接受答案是:
使用静态只读变量而不是 const 的原因是由于与非托管代码的使用有关,正如 Microsoft 在 Shared Source Common Language Infrastructure 2.0 Release 中所指出的那样。 要查看的文件是 sscli20 \ clr \ src \ bcl \ system \ string.cs。
Empty 常量保持空字符串值。 我们需要调用 String 构造函数,以便编译器不将其标记为文字常量。 如果将其标记为文字常量,则无法从本地访问该字段。
我从 CodeProject 的这篇有用的文章中找到了这些信息。

我认为你应该将这标记为重复问题,而不是直接给出答案。 - Harrison

2

static readonly字段不是编译时常数,而只是一个静态字段,在其所在的类完成初始化后不应更改。

在当前的 .net 实现中,您甚至可以使用反射来更改它,这会导致非常奇怪的行为。

您可以使用""代替,作为字符串文字是编译时常数。


1

readonly 字段是一个运行时常量。它在对象(或类,如果字段是 static)初始化之前不会绑定到值。

编译时常量是字面量(例如 "" - 实际上与 String.Empty 是相同的东西)和任何标记为 const 的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接