我非常好奇地寻找解释为什么在C#.NET设计器中不允许使用以下代码:
const foo f = new foo();
它给出以下错误消息:
'f'的类型为'ConsoleApplication1.foo'。参考的const字段 string以外的类型只能用null初始化。
问题是:为什么?有人可以解释这个const
要求吗?
提前致谢。
答案 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" };
即使上面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" };
。 但如果对象是可变的,可以修改它引用的内容:
{{1}}
希望这会有所帮助......
答案 2 :(得分:3)
const表示该值在编译时已知。因为new分配了一个对象(如果程序没有运行,这是不可能的),你不能将const设置为一个新对象。你可以达到类似这样的东西:
static readonly Foo foo = new Foo()
答案 3 :(得分:2)
实际上,错误文本令人困惑,因为它是一个局部变量(在方法中声明),而不是一个字段(在方法之外声明,属于一个类(或结构))。
您必须删除const
,因为正如其他人所说,它对string
以外的参考类型没用。