Why can't I use String.Empty as a default parameter value?

旧时模样 提交于 2019-12-08 17:23:00

问题


Today I was creating a default parameter value in a constructor.

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

The compiler complained.

Default parameter value for "something" must be a compile-time constant.

I was under the impression that Empty on the String class was a compile-time constant.

.field public static initonly string Empty

Am I missunderstanding the meaning of compile-time constant, or is it just more wackyness that I need to accept?


回答1:


The accepted answer to this SO Question Why isn't String.Empty a constant? is:

The reason that static readonly is used instead of const is due to use with unmanaged code, as indicated by Microsoft here in the Shared Source Common Language Infrastructure 2.0 Release. The file to look at is sscli20\clr\src\bcl\system\string.cs.

The Empty constant holds the empty string value. We need to call the String constructor so that the compiler doesn't mark this as a literal.

Marking this as a literal would mean that it doesn't show up as a field which we can access from native.

I found this information from this handy article at CodeProject.




回答2:


A static readonly field is not a compile-time constant. It's just a static field, which should not change after the class in which it is finished initializing.

In the current .net implementation you can even change it with reflection, which leads to really weird behavior.

You can use "" instead, which as a string literal is a compile time constant.




回答3:


A readonly field is a run-time constant. It won't be bound to a value until the object (or class, if the field is static) is initialized.

Compile-time constants are literals (such as "" - which essentially the same thing as String.Empty, anyway) and anything marked const.



来源:https://stackoverflow.com/questions/10825423/why-cant-i-use-string-empty-as-a-default-parameter-value

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!