为什么const mytype _var = new mytype()不起作用?

时间:2012-07-17 14:14:36

标签: c# const

我非常好奇地寻找解释为什么在C#.NET设计器中不允许使用以下代码:

const foo f = new foo();

它给出以下错误消息:

  

'f'的类型为'ConsoleApplication1.foo'。参考的const字段   string以外的类型只能用null初始化。

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

提前致谢。

4 个答案:

答案 0 :(得分:10)

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

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

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

private readonly foo f = new foo();

答案 1 :(得分:3)

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

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

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

您可以拥有readonly字段,该字段只允许在初始值设定项或构造函数中设置字段。从本质上讲,它类似于const,但它是在运行时确定的,可以是static或实例(所有const字段都是static自动生成)。

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

例如:

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

即使上面validStringsreadonly,也只表示您无法通过将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" }; 如果对象是可变的,可以修改它引用的内容:

{{1}}

希望这会有所帮助......

答案 2 :(得分:3)

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

static readonly Foo foo = new Foo()

答案 3 :(得分:2)

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

您必须删除const,因为正如其他人所说,它对string以外的参考类型没用。