here 및 here과 관련된 몇 가지 관련 질문이 있지만 만족스러운 답변을 제공하지 못했습니다. 문제는 C#의 클래스에 중첩 된 enum은 클래스의 속성과 동일한 이름을 가질 수 없다는 것입니다. 내 예 :중첩 열거 형 및 속성 명명 충돌
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; }
...
}
이 문제를 해킹하기위한 몇 가지 옵션이 있지만 나에게 맞는 것 같지 않습니다.
클래스 외부로 열거 형을 이동할 수 있지만 Card.Suit
대신 Suit
이라고 말하면 잘못된 것 같습니다. Card
의 컨텍스트 외부에 Suit
은 무엇입니까?
클래스 외부로 이동하여 CardSuit
및 CardRank
과 같은 것으로 변경할 수는 있지만 클래스 또는 클래스에서 처리해야하는 열거 형의 이름에 컨텍스트 정보를 베이킹하고있는 것처럼 느낍니다. 이름 공간 이름.
열거 형 이름을 Suits
및 Ranks
으로 변경할 수 있지만 Microsoft's naming guidelines을 위반합니다. 그리고 그것은 옳다고 느끼지 않습니다.
속성 이름을 변경할 수 있습니다. 그러나 무엇에? 직관적으로 내게는 Suit = Card.Suit.Spades
라고 말하고 싶어합니다.
이 열거 형을 포함하는 CardInfo
이라는 개별 정적 클래스로 열거 형을 이동할 수 있습니다. 내가 다른 것을 생각해 낼 수 없다면, 이것이 최선의 선택이라고 생각합니다.
다른 사람들이 비슷한 상황에서 무엇을했는지 궁금합니다. 왜 이것이 허용되지 않는지 아는 것도 좋을 것입니다. 어쩌면 에릭 리 퍼트 (Eric Lippert) 또는 누군가가 금지 결정을 내릴 수 있습니까? 클래스가 안에있는 경우에만 내에 모호성이 생성되고 이는 속성 이름에 this.Suit
을 사용하여 해결할 수 있습니다. (지방 주민과 회원 사이의 모호성과 유사합니다.) 나는 이것이 "every feature starts with -100 points" 일로 인해 빠져 나갔다고 가정하지만, 이것에 관한 토론에 대해 궁금 할 것입니다.
의견을 보내 주셔서 감사합니다. 나는'CardInfo'로 갈 것이지만, 여기에 하나의 정식 답이 없다고 생각합니다. 괜찮은 옵션이 많이 있습니다. 그리고 스타일이 좋다고 생각합니다. –
'enum'중첩은 클래스 내부에서 (주로?) 사용하려는 경우 괜찮습니다. 그런 다음 필드/속성과의 이름 충돌을 피하기 위해'enum' *을 약간 다르게 (이름에 * Type *, * Mode *, * Option * 등을 추가) 이름을 붙여야합니다. 그 클래스 밖에서'enum '을 사용하는 사용자가 많이있을 경우, 중첩은 나쁜 생각입니다. 동일한 cs-file에서 선언 할 수 있습니다 (사용되는 클래스와 적어도 일종의 관계를 가짐). 중첩은 wpf에서 바람직하지 않습니다 (반드시 'enum'은 아니지만 일반적으로). – Sinatr