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后防止更改它们,则这是一个选项。另一个选项不足。