【发布时间】:2014-12-30 05:11:17
【问题描述】:
这个问题其实很简单。以下代码在其正下方抛出异常:
class Foo
{
public const StringBuilder BarBuilder = new StringBuilder();
public Foo(){
}
}
错误:
Foo.BarBuilder' 的类型为'System.Text.StringBuilder'。一个常量字段 字符串以外的引用类型只能用 空。
MSDN 这么说,我理解并且从const 的角度来看是有道理的:
常量表达式是可以在 编译时间。因此,常数的唯一可能值 引用类型是字符串和空引用。
但是,我看不出我们使用null 常量的原因或位置。那么为什么首先可以使用const 定义引用类型(字符串除外)如果它只能设置为null 并且如果这是一个深思熟虑的决定(我相信它是)那么我们在哪里可以使用带空值的常量?
更新:
当我们想到一个答案时,请让我们以不同的方式思考“我们有这个,所以为什么不那个......”上下文。
【问题讨论】:
-
你是在问“你为什么要使用
null?” -
该语言中有许多可以编译但对任何人都没有明显用途的结构(例如,密封的、空的类)。编译器不会尝试确保程序的有用性。
-
您可以使用
null常量来声明可选参数。 -
@Tarik 这是的原因。常量只是在程序中具有特殊含义的特定文字的别名。它在编译时与实际文字一起被切换出来。可以对值类型、字符串和空引用执行此操作,因为它们的值在编译时是完全已知的,因此编译器很乐意接受它们。编译器没有理由专门考虑“哦,null consts 实际上没有用”,并给你一个构建错误。
-
@Tarik 也许我误解了你的意思,但是编译器优化与这个讨论完全无关。带有或不带有优化的编译器应该符合相同的语言规范,这就是您的问题所在(为什么 C# 语言规范允许在常量中使用空值)。