【发布时间】:2011-01-16 12:19:36
【问题描述】:
有一些相关的问题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,这对我来说似乎是错误的。在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 文件中声明它(至少与使用它的类有某种关系)。 wpf 中也不需要嵌套(不一定是enum,但一般来说)。