C# 为什么const mytype _var=new mytype()不';不行?

C# 为什么const mytype _var=new mytype()不';不行?,c#,constants,C#,Constants,我很好奇,想知道为什么C#.NET designer中不允许使用以下代码: const foo f = new foo(); 它会给出以下错误消息: “f”的类型为“ConsoleApplication1.foo”。引用的常量字段 字符串以外的类型只能用null初始化 问题是:为什么?有人能解释一下这个const要求吗 提前感谢。因为C#中的常量必须是编译时常量。因此,唯一有效的const选项(对于大多数引用类型)是null 一个例外是string,您可以将其分配给字符串文本 // allow

我很好奇,想知道为什么C#.NET designer中不允许使用以下代码:

const foo f = new foo();
它会给出以下错误消息:

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

问题是:为什么?有人能解释一下这个
const
要求吗


提前感谢。

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

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

// allowed because string literals are compile-time
private const string Message = "Hello World";
您可以有一个
只读
字段,该字段只允许在初始值设定项或构造函数中设置该字段。本质上,这类似于
常量
,但它是在运行时确定的,可以是
静态
或实例(所有
常量
字段都是
静态
自动)

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

例如:

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

希望这有助于…

因为
常量必须是可以在编译时解决的

newfoo()将在运行时执行

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

private readonly foo f = new foo();

const表示编译时已知该值。因为new分配一个对象(如果程序没有运行,这是不可能的),所以不能为新对象设置常量。您可以实现以下类似的目标:

static readonly Foo foo = new Foo()

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


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

以外的引用类型无效。这个问题至少被问了10次。请搜索。可能的副本非常感谢您的回答!我会在6分钟内接受它。由于错误文本在名称
f
之前不包含包含类型,我确实确定原始海报真正包含的是一个本地变量,而不是一个字段。因此,在这种情况下,不允许说
private
readonly
。@JeppeStigNielsen如果是这样的话,那么他可能不会接受这个职位,因为它不会解决他的问题。@Servy可能是这样。也许“ConsoleApplication1”不是他真正遇到问题的地方,而是他为测试它而制作的沙盒。但是我确信他引用的编译器错误文本来自一个局部变量,因为如果它是一个(静态或实例)字段,编译器会在消息的开头包含名称空间限定类型名。再次感谢您的解释!杰克:没问题,我只是好奇为什么一定有人投了反对票而没有解释为什么。。。
static readonly Foo foo = new Foo()