Есть несколько связанных вопросов здесь и здесь , но они действительно не дали мне удовлетворительных ответов. Проблема в том, что перечисления, вложенные в класс в C #, не могут иметь то же имя, что и свойство класса. Мой пример:
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; }
...
}
Есть несколько вариантов взлома, но они мне не кажутся правильными.
Я могу переместить перечисления за пределы класса, но тогда вы просто скажете Suit
вместо Card.Suit
, что мне кажется неправильным. Что такое Suit
вне контекста Card
?
Я мог бы переместить их за пределы класса и изменить их на что-то вроде CardSuit
и CardRank
, но тогда я чувствовал бы, что я вставляю контекстную информацию в имя перечисления, когда это должно быть обработано имя класса или пространства имен.
Я мог бы изменить имена перечислений на Suits
и Ranks
, но это нарушает Рекомендации Microsoft по именованию . И это просто нехорошо.
Я мог бы изменить имена свойств. А к чему? Мне интуитивно кажется, что я хочу сказать Suit = Card.Suit.Spades
.
Я мог бы переместить перечисления в отдельный статический класс с именем CardInfo
, содержащий только эти перечисления. Если я не могу придумать что-то еще, я думаю, что это лучший вариант.
Так что мне интересно, что другие люди сделали в подобных ситуациях. Также было бы приятно узнать, почему это запрещено. Может быть, Эрик Липперт или кто-то может вмешаться в решение запретить это? Похоже, что это создает только неопределенность внутри класса, и это может быть решено путем принудительного использования this.Suit
для имени свойства. (Похоже на устранение неоднозначности между местными жителями и членами.) Я предполагаю, что это было опущено из-за «каждая функция начинается с -100 баллов» , но мне было бы интересно обсудить это.