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

本文关键字:上下文 null 无效 错误 数组 const | 更新日期: 2023-09-27 17:49:16

我有一个类:

class SomeTests {
  private Guid[] someGuids = new Guid[] { ... }
  public void ThoseGuidsShouldAlwaysBeThere() {
    foreach (Guid g in someGuids) { // error appears here
        // ...
    }
  }
}

在语义上,我希望someGuidsconst,因为它们不应该被更新,除非在重新编译代码之前。但是添加const关键字会产生错误CS0168: null is not valid in this context.

阅读MSDN页面的错误,在我看来,编译器认为我正在这样做:

foreach (Guid g in null) {

我不明白在这里添加const是如何导致这个问题的,以及如何解决我的语义问题(列表是只读的,不可写的)——保持它作为一个数组而不是一个列表是"几乎"足够好。

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

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() });

集合将不能再被重新实例化,也不能再修改其成员。

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

改成readonly:

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

当它是readonly时,你也可以在构造函数中赋值:

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

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