4

我很好奇为什么 C#.NET 设计器中不允许使用以下代码的解释:

const foo f = new foo();

它给出以下错误消息:

“f”的类型为“ConsoleApplication1.foo”。字符串以外的引用类型的 const 字段只能用 null 初始化。

问题是:为什么?有人可以解释这个const要求吗?

提前致谢。

4

4 回答 4

10

因为 aconst必须是可以在编译时解决的问题。

new foo();将在运行时执行。

您可能希望使用readonly关键字来确保它不能在构造函数之外初始化:

private readonly foo f = new foo();
于 2012-07-17T14:16:07.033 回答
3

因为constC# 中的 a 必须是编译时常量。因此,唯一有效的const选项(对于大多数引用类型)是null.

一个例外是string您可以将其分配给字符串文字。

// allowed because string literals are compile-time
private const string Message = "Hello World";

您可以拥有一个readonly字段,这将允许该字段仅在初始化程序或构造函数中设置。本质上,这类似于 a ,const只是它是在运行时确定的,并且可以是static或实例(所有const字段都是static自动的)。

但是,应该注意,readonly引用只是意味着该引用是只读的,这并不意味着它所引用的对象也是只读的(当然,除非该对象在设计上是不可变的,例如string)。

例如:

private readonly List<string> validStrings = new List<string> { "Apple", "Orange", "Pear" };

即使validStrings上面是readonly,它仅意味着您不能通过validStrings将其分配给新参考来进行更改。 但是如果对象是可变的,您可以修改它所指的内容:

// allowed, you can change what it refers to
validStrings.Clear();

// disallowed, cannot change what the reference refers to outside of constructor
validStrings = new List<string> { "Other", "Stuff" };

希望这可以帮助...

于 2012-07-17T14:16:05.557 回答
3

const 表示该值在编译时是已知的。因为 new 分配一个对象(如果程序没有运行,这是不可能的),你不能将 const 设置为一个新对象。你可以实现一些类似这样的东西:

static readonly Foo foo = new Foo()
于 2012-07-17T14:17:30.713 回答
2

实际上,错误文本令人困惑,因为它是您拥有的局部变量(在方法内部声明),而不是字段(在方法外部声明,属于类(或结构))。

您必须删除const,因为正如其他人所说,它对于除string.

于 2012-07-17T14:26:20.517 回答