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

时间:2012-05-30 22:55:36

标签: .net string default-parameters

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

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

编译器抱怨道。

  

“something”的默认参数值必须是编译时   恒定。

我的印象是String类上的Empty是编译时常量。

.field public static initonly string Empty

我是否理解编译时常量的含义,还是我需要接受的更为古怪?

3 个答案:

答案 0 :(得分:4)

this已接受答案SO问题为什么String.Empty不是常量?是:

使用静态只读而不是const的原因是由于使用了非托管代码,如Microsoft在共享源公共语言基础结构2.0版本中所示。要查看的文件是sscli20 \ clr \ src \ bcl \ system \ string.cs。

Empty常量保存空字符串值。我们需要调用String构造函数,以便编译器不会将其标记为文字。

将此标记为文字将意味着它不会显示为我们可以从本机访问的字段。

我在CodeProject上从这个方便的article找到了这些信息。

答案 1 :(得分:2)

static readonly字段不是编译时常量。它只是一个静态字段,在完成初始化的类之后不应该改变。

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

您可以使用"",而字符串文字是编译时常量。

答案 2 :(得分:1)

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

编译时常量是文字(例如"" - 与String.Empty完全相同),以及标记为const的任何内容。