【问题标题】:Why const mytype _var = new mytype() doesn't work?为什么 const mytype _var = new mytype() 不起作用?
【发布时间】:2012-07-17 14:14:36
【问题描述】:

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

const foo f = new foo();

它给出以下错误消息:

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

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

提前致谢。

【问题讨论】:

标签: c# constants


【解决方案1】:

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

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

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

private readonly foo f = new foo();

【讨论】:

  • 非常感谢您的回答!我会在 6 分钟内接受它。
  • 由于错误文本在名称f 之前不包含包含类型,我真的很确定原始海报真正拥有的是本地变量,而不是一个领域。因此,在这种情况下,不允许使用 privatereadonly
  • @JeppeStigNielsen 如果是这样,那么他可能不会接受这个帖子,因为它不会解决他的问题。
  • @Servy 也许是这样。也许“ConsoleApplication1”并不是他真正出现问题的地方,而只是他为测试它而制作的一个沙箱。但我确信他引用的编译器错误文本来自一个局部变量,因为它是一个(静态或实例)字段,编译器会在消息的开头包含命名空间限定的类型名称。
【解决方案2】:

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

static readonly Foo foo = new Foo()

【讨论】:

    【解决方案3】:

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

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

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

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

    但是,应该注意readonly 引用只是意味着引用是只读的,这并不意味着它引用的对象也被读取-only(当然,除非对象在设计上是不可变的,例如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。
    • @Jack:没问题,我只是好奇为什么其他人一定会在没有解释原因的情况下否决它......
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多