这里和这里有一些相关的问题,但它们并没有真正给我满意的答案.问题是嵌套在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,但是这违反了微软的命名规则.它感觉不对劲.
我可以更改属性名称.但到了什么?我觉得直觉对我来说是对的Suit = Card.Suit.Spades.
我可以将枚举移动到一个单独的静态类中,该类CardInfo只包含这些枚举.如果我不能提出任何其他建议,我认为这是最好的选择.
所以我想知道其他人在类似的情况下做了什么.知道为什么不允许这样做也很好.也许埃里克·利珀特(Eric Lippert)或其他人可能会决定禁止它?它似乎只会在类中产生歧义,这可以通过强制使用this.Suit属性名来解决.(类似于消除当地人和成员之间的歧义.)我认为这是由于"每个功能以-100点开始"的事情而被遗漏,但我会对围绕此问题的讨论感到好奇.
Eri*_*ert 19
知道为什么不允许这样做也很好.也许埃里克·利珀特(Eric Lippert)或其他人可能会决定禁止它?
规则的要点是确保在查找名称时类中没有歧义.某些代码区域被指定为定义"声明空间".声明空间的基本规则是在同一声明空间中声明的两个事物具有相同的名称(方法除外,它们必须通过签名而不是名称来区分.)
对此规则进行例外处理只会让事情变得更加混乱,而不会让人感到困惑.我同意你不能在同一个声明空间中声明一个属性和一个同名的枚举,但是一旦你开始制作异常,它就会变得一团糟.它通常是一个很好的属性,名称唯一标识方法组,类型参数,属性等.
请注意,此规则适用于事物宣布的声明空间,没有东西用在声明空间.如果类型Suit未在与属性相同的声明空间中声明,则说"public Suit Suit {get; set;}"是完全合法的.当有人说"Suit.X"时,弄清楚X是否在类型上(即X是静态成员)或属性(即X是实例成员)有点棘手.有关详细信息,请参阅我的文章:
http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx
我更喜欢使用名词后跟选项来命名枚举。在你的情况下:
SuitOptions
RankOptions
毕竟,枚举只是一组可能的选项,对吧?
然后你将拥有:
myCard.Suit = Card.SuitOptions.Clubs;
在我看来,这是有道理的,您在查看文本时仍然能够知道是枚举还是属性。