使数组const产生“使用null在此上下文中无效”错误

时间:2012-12-20 17:12:46

标签: c# compiler-errors

我有一个类:

class SomeTests {
  private Guid[] someGuids = new Guid[] { ... }

  public void ThoseGuidsShouldAlwaysBeThere() {
    foreach (Guid g in someGuids) { // error appears here
        // ...
    }
  }
}

从语义上讲,我希望someGuidsconst,因为除了重新编译代码之外,它们不应该被更新。但添加const关键字会生成error CS0168null is not valid in this context.

在这个错误的MSDN页面上,我觉得编译器认为我这样做了:

foreach (Guid g in null) {

我不明白添加const如何导致此问题,以及如何解决我的语义问题(列表是只读的,不可写的) - 将其保存为数组而不是List是“几乎“足够好。

2 个答案:

答案 0 :(得分:3)

此用途中的readonly关键字有点误导。将其视为阻止集合重新实例化而不是修改。

示例:

 private readonly Guid[] someGuids = new Guid[] { Guid.NewGuid() };

 //This will not compile because it is read-only.
 someGuids = new Guid[] { Guid.NewGuid() };

 //This still compiles, and the first member will be changed
 someGuids[0] = Guid.NewGuid();

我建议您考虑将System.Collections.ObjectModel.ReadOnlyCollection<T>readonly关键字结合使用。

示例:

    public readonly ReadOnlyCollection<Guid> someGuids = new
       ReadOnlyCollection<Guid>(new Guid[] { Guid.NewGuid(), Guid.NewGuid() });

该集合将不再能够重新实例化,也无法修改其成员。

答案 1 :(得分:2)

尝试使Guid[]成为常量应该会给出错误“除了字符串之外的引用类型的const字段只能用null初始化。”

改为readonly

private readonly Guid[] someGuids = new Guid[] { Guid.NewGuid() };

如果是readonly,您还可以在构造函数中指定值:

public SomeTests()
{
    someGuids = new[] { Guid.NewGuid(), Guid.NewGuid() };
}

正如Jeffery在评论中提到的,此解决方案阻止重新分配someGuids,但仍可以修改项目。 Jeffery在他的回答中解决了这个问题。