C# 为什么const mytype _var=new mytype()不';不行?
我很好奇,想知道为什么C#.NET designer中不允许使用以下代码: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
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()