Здесь есть несколько связанных вопросов здесь и , но они действительно не дали мне удовлетворительных ответов, Проблема в том, что перечисления, вложенные в класс в С#, не могут иметь то же имя, что и свойство класса. Мой пример:
public class Card
{
public enum Suit
{
Clubs,
Diamonds,
Spades,
Hearts
}
public enum Rank
{
Two,
Three,
...
King,
Ace
}
public Suit Suit { get; private set; }
public Rank Rank { get; private set; }
...
}
Есть несколько вариантов взломать это, но они мне кажутся не такими.
Я мог бы перемещать enums вне класса, но тогда вы просто сказали бы Suit
вместо Card.Suit
, что кажется мне неправильным. Что такое Suit
вне контекста Card
?
Я мог бы перемещать их за пределы класса и менять их на что-то вроде CardSuit
и CardRank
, но тогда я хотел бы, чтобы я выпекал контекстную информацию в имя перечисления, когда это должно быть обработано имя класса или имени пространства.
Я мог бы изменить имена перечислений на Suits
и Ranks
, но это нарушает Принципы именования Microsoft. И это просто не так.
Я могу изменить имена свойств. Но к чему? Мне кажется, что я хочу сказать, Suit = Card.Suit.Spades
.
Я мог бы переместить перечисления в отдельный статический класс под названием CardInfo
, содержащий только эти перечисления. Если я не могу придумать что-нибудь еще, я думаю, что это лучший вариант.
Так что мне интересно, что сделали другие люди в подобных ситуациях. Было бы также неплохо узнать, почему это запрещено. Может быть, Эрик Липперт или кто-то может вмешаться в решение о его запрете? Похоже, он только создает неоднозначность внутри класса, и это можно решить, заставив использовать this.Suit
для имени свойства. (Подобно неоднозначности между местными жителями и членами.) Я предполагаю, что это было исключено из-за "каждая функция начинается с -100 пунктов" , но мне было бы интересно узнать об этом.