有一些相关的问题herehere,但它们并没有真正给我令人满意的答案。问题在于,嵌套在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

我可以将它们移到类之外,然后将它们更改为CardSuitCardRank,但是当我应该将上下文信息烘焙到枚举的名称中时,应该由类或 namespace 名称来处理它们。

我可以将枚举的名称更改为SuitsRanks,但这违反了Microsoft's naming guidelines。而且感觉不对。

我可以更改属性名称。但是要做什么呢?我想说Suit = Card.Suit.Spades感觉很直观。

我可以将枚举移动到一个单独的静态类CardInfo中,该静态类仅包含这些枚举。如果我无法提出其他建议,我认为这是最佳选择。

所以我想知道其他人在类似情况下做了什么。知道为什么不允许这样做也是很高兴的。也许埃里克·利珀特(Eric Lippert)或有人可以禁止它吗?看来这只会在类中造成歧义,可以通过强制使用this.Suit作为属性名来解决。 (类似于在本地人和成员之间消除歧义。)我认为这是由于"every feature starts with -100 points"问题而被排除在外的,但我会对围绕此的讨论感到好奇。

最佳答案



规则的重点是确保查找名称时类内没有歧义。某些代码区域被指定为定义“声明空间”。声明空间的基本规则是,在同一声明空间中声明的两件事都没有名字(方法必须除外,签名必须不同,而不是名称)。

对此规则进行异常(exception)处理只会使事情更加困惑,而不是减少困惑。我同意令人讨厌的是,您不能在同一个声明空间中声明具有相同名称的属性和枚举,但是一旦您开始创建异常,那就变得一团糟。通常,这是一个很好的属性,名称可以唯一地标识方法组,类型参数,属性等。

请注意,此规则适用于在声明空间中声明的事物,而不适用于在声明空间中使用的事物。如果未在与属性相同的声明空间中声明Suit类型,则说“public Suit Suit {get; set;}”是完全合法的。当有人说“Suit.X”时,弄清楚X是在类型上(即X是静态成员)还是在属性上(即X是实例成员)有点棘手。有关详细信息,请参阅我的文章,我们如何做到这一点:

http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx

关于c# - 嵌套枚举和属性命名冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2258033/

10-10 07:19