Здесь есть несколько связанных вопросов здесь и , но они действительно не дали мне удовлетворительных ответов, Проблема в том, что перечисления, вложенные в класс в С#, не могут иметь то же имя, что и свойство класса. Мой пример:
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 пунктов" , но мне было бы интересно узнать об этом.