在C#中,我想要创建“智能”枚举,就像Java中可能的那样,其中一个枚举值附加了比基础int类型更多的信息。我偶然发现了一种制作类(而不是枚举)的方法,例如以下简单示例:
public sealed class C
{
public static readonly C C1 = new C(0, 1);
public static readonly C C2 = new C(2, 3);
private readonly int x;
private readonly int y;
private C(int x, int y)
{
this.x = x;
this.y = y;
}
public int X
{
get
{
return this.x;
}
}
public int Y
{
get
{
return this.y;
}
}
}
然而,当我在Visual Studio上运行“代码分析器”时,它会给出警告C2104,“不要声明只读的可变引用类型”。
我知道你通常不想声明只读的可变引用类型,但是……我的类不可变,对吧?
阅读警告文档,似乎它们只是假设任何只读引用类型都是可变的。例如,它说如果类型确实是不可变的,则可以随意禁止此警告。 实际上,即使是下面更简单的类,它也会给我同样的警告:
public sealed class C
{
public static readonly C C1 = new C();
public static readonly C C2 = new C();
private C()
{
}
}
好的,除非我严重误解可变性,否则CA2104无法理解它。其建议是只要我确定该类确实是不可变的,在每个出现警告的行上都抑制警告。但是:
(1) 那么,除非我完全关闭此检查,否则每次使用不可变的只读成员时,我都必须抑制它,而我可能会为任何给定的枚举使用数百次?
(2) 更糟糕的是,即使我这样做了,然后有人可以意外地引入可变性,但其他人仍然会被手动放置抑制警告所带来的虚假安全感所迷惑,“我检查过这是不可变的”?