There are some related questions here and here, but they didn't really give me satisfactory answers. The problem is that enums nested in a class in C# cannot have the same name as a property of the class. My example:
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; }
...
}
There are a few options to hack around this, but they don't seem right to me.
I could move the enums outside the class, but then you would just say Suit
instead of Card.Suit
, which seems wrong to me. What is a Suit
outside the context of a Card
?
I could move them outside the class and change them to something like CardSuit
and CardRank
, but then I'd feel like I'm baking context information into the name of the enum, when that should be handled by a class or namespace name.
I could change the names of the enums to Suits
and Ranks
, but this violates Microsoft's naming guidelines. And it just doesn't feel right.
I could change the property names. But to what? It feels intuitively right to me to want to say Suit = Card.Suit.Spades
.
I could move the enums into a separate static class called CardInfo
containing only these enums. If I can't come up with anything else, I think this is the best option.
So I'm wondering what other people have done in similar situations. It would also be nice to know why this is disallowed. Maybe Eric Lippert or someone could chime in on the decision to forbid it? It seems like it only creates ambiguity within the class, and this could be resolved by forcing the use of this.Suit
for the property name. (Similar to disambiguating between locals and members.) I assume this was left out due to the "every feature starts with -100 points" thing, but I would be curious about discussions around this.