为什么我不能用的String.Empty作为默认的参数值?(Why can't I use

2019-09-17 15:13发布

今天,我创建在构造函数中默认的参数值。

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

编译器抱怨。

对于“东西”默认参数值必须是一个编译时间常数。

我的印象是,空String类是一个编译时间常数的情况下。

.field public static initonly string Empty

我是不是missunderstanding编译时的含义不变,或只是更wackyness,我需要接受?

Answer 1:

接受的答案, 这个 SO问题为什么没有的String.Empty恒定的? 是:

静态只读代替常量的原因是由于与非托管代码中使用,如微软共享源代码公共语言基础2.0版本在这里显示。 该文件看,就是sscli20 \ CLR \ SRC \ BCL \ SYSTEM \ string.cs。

空不变持有空字符串值。 我们需要调用String构造,这样编译器并不标志着这是一个文字。

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

我发现从这个方便的信息文章在CodeProject。



Answer 2:

一个static readonly域是不是编译时间常数。 这只是一个静态字段,它不应该在它完成初始化类后更改。

在当前的.NET实现你甚至可以与反思,从而导致真正怪异的行为改变。

您可以使用""来代替,这是一个字符串文字是一个编译时间常数。



Answer 3:

一个readonly字段是一个运行时间不变。 它不会被绑定到一个值,直到对象(或类,如果字段是static )被初始化。

编译时间常数文字(如"" -这基本上是同样的事情String.Empty ,反正)和任何标记const



文章来源: Why can't I use String.Empty as a default parameter value?