Ci sono alcune domande correlate here e here, ma in realtà non mi hanno dato risposte soddisfacenti. Il problema è che le enumerazioni nidificate in una classe in C# non possono avere lo stesso nome di una proprietà della classe. Il mio esempio:Nested enum e conflitti di denominazione delle proprietà
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; }
...
}
Ci sono alcune opzioni per hackerare intorno a questo, ma non mi sembra giusto.
Potrei spostare l'enum fuori dalla classe, ma poi diresti semplicemente Suit
invece di Card.Suit
, che mi sembra sbagliato. Che cos'è un Suit
al di fuori del contesto di un Card
?
li riuscivo a muovere al di fuori della classe e cambiarli in qualcosa di simile CardSuit
e CardRank
, ma poi mi sento come se fossi la cottura le informazioni di contesto nel nome della enum, quando questo dovrebbe essere gestita da una classe o nome dello spazio dei nomi.
potevo cambiare i nomi delle enumerazioni per Suits
e Ranks
, ma questo viola Microsoft's naming guidelines. E non sembra giusto.
Potrei cambiare i nomi delle proprietà. Ma a cosa? Mi sembra intuitivamente giusto dire che voglio dire .
È possibile spostare l'enumerazione in una classe statica separata denominata CardInfo
contenente solo queste enumerazioni. Se non riesco a trovare qualcos'altro, penso che questa sia l'opzione migliore.
Quindi mi chiedo cosa hanno fatto le altre persone in situazioni simili. Sarebbe anche bello sapere perché questo non è consentito. Forse Eric Lippert o qualcuno potrebbe prendere in considerazione la decisione di vietarlo? Sembra che crei solo l'ambiguità all'interno della classe, e questo potrebbe essere risolto forzando l'uso di this.Suit
per il nome della proprietà. (Simile al disambiguazione tra locali e membri.) Presumo che questo sia stato omesso a causa della cosa "every feature starts with -100 points", ma sarei curioso di discutere su questo argomento.
Grazie per il feedback, tutti. Vado con 'CardInfo', ma non penso che ci sia una risposta canonica qui. Ci sono molte opzioni decenti e penso che dipenda dallo stile. –
Annidare 'enum' è ok se li userai solo (soprattutto?) All'interno della classe. Quindi devi nominare enum' * leggermente * in modo diverso (aggiungendo * Tipo *, * Modalità *, * Opzione *, ecc. Al nome) per evitare conflitti di nome con campo/proprietà. Se ci saranno molti utenti di quel 'enum' al di fuori della classe, allora l'annidamento è una cattiva idea. Puoi dichiararlo nello stesso file CS (per avere almeno una sorta di relazione con la classe in cui è usato). Anche la nidificazione è indesiderabile in wpf (non necessariamente 'enum', ma in generale). – Sinatr