将数组设为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
// ...
}
}
}
在语义上,我希望someGuids
是const
,因为它们不应该被更新,除非在重新编译代码之前。但是添加const
关键字会产生错误CS0168: null is not valid in this context.
阅读MSDN页面的错误,在我看来,编译器认为我正在这样做:
foreach (Guid g in null) {
我不明白在这里添加const
是如何导致这个问题的,以及如何解决我的语义问题(列表是只读的,不可写的)——保持它作为一个数组而不是一个列表是"几乎"足够好。
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在他的回答中提到了这个问题