有一些相关的问题here和here,但它们并没有真正给我令人满意的答案。问题在于,嵌套在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
,但是当我应该将上下文信息烘焙到枚举的名称中时,应该由类或 namespace 名称来处理它们。我可以将枚举的名称更改为
Suits
和Ranks
,但这违反了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/