C# 使数组常量生成“0”;在此上下文中使用null无效;错误

C# 使数组常量生成“0”;在此上下文中使用null无效;错误,c#,compiler-errors,C#,Compiler Errors,我有一门课,像: class SomeTests { private Guid[] someGuids = new Guid[] { ... } public void ThoseGuidsShouldAlwaysBeThere() { foreach (Guid g in someGuids) { // error appears here // ... } } } 从语义上讲,我希望someguid是const,因为除非在重新编译代码之前,它们

我有一门课,像:

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

  public void ThoseGuidsShouldAlwaysBeThere() {
    foreach (Guid g in someGuids) { // error appears here
        // ...
    }
  }
}
从语义上讲,我希望
someguid
const
,因为除非在重新编译代码之前,它们永远不应该被更新。但是添加
const
关键字会生成:
null在该上下文中无效。

在阅读MSDN页面中的错误时,我觉得编译器认为我在这样做:

foreach(Guid g为空){


我不明白添加
const
是如何导致这个问题的,以及如何解决我的语义问题(列表是只读的,不可写的)--将其作为数组而不是列表“几乎”就足够了。

尝试将
Guid[]
设为常量应该会给您一个错误“引用类型不是字符串的常量字段只能用null初始化。”

改为“只读”
readonly

private readonly Guid[] someGuids = new Guid[] { Guid.NewGuid() };
当它为只读时,您还可以在构造函数中赋值:

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

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

此用法中的
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();
    public readonly ReadOnlyCollection<Guid> someGuids = new
       ReadOnlyCollection<Guid>(new Guid[] { Guid.NewGuid(), Guid.NewGuid() });
我建议您将
System.Collections.ObjectModel.ReadOnlyCollection
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();
    public readonly ReadOnlyCollection<Guid> someGuids = new
       ReadOnlyCollection<Guid>(new Guid[] { Guid.NewGuid(), Guid.NewGuid() });
public readonly ReadOnlyCollection someGuids=new
ReadOnlyCollection(新Guid[]{Guid.NewGuid(),Guid.NewGuid()});

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

我实际上没有得到常量字段引用类型nullz“错误。可能是VS2008错误;如果我注释掉我的
foreach
迭代,我就可以编译。使它成为
readonly
并从构造函数中赋值也很有效。这不会阻止集合被修改,只会阻止它被重新实例化。你仍然可以修改成员。例如
someGuids[0]=新Guid()
@JefferyKhan是的。虽然这很难保证投反对票。这个问题实际上有两个部分。同意,我将删除它,但我会提到那一部分。OP声明他们不希望GUI能够更改:
因为它们永远不应该更新,除非在重新编译代码之前,不幸的是,我不能更新除非您编辑q,否则请移动我的下一票。这不是编译器错误。它的行为与预期的完全一致。如果您的目标是在设置GUID后防止更改它们,则这是一个选项。另一个选项不足。