В 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) Но что еще хуже, даже если я это сделаю, то потом кто-то может случайно ввести изменчивость, а у кого-то все равно будет ложное чувство безопасности, даваемое тем фактом, что кто-то вручную поставил туда подавление со словами «Я проверил, и это неизменяемо "?