c# - 嵌套枚举和属性命名冲突

标签 c# .net enums

还有一些相关的问题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,这对我来说似乎是错误的。在 Card 上下文之外的 Suit 是什么?

我可以将它们移到类之外并将它们更改为 CardSuitCardRank 之类的东西,但我觉得我正在将上下文信息烘焙到名称中枚举,当它应该由类或命名空间名称处理时。

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

我可以更改属性名称。但是为了什么?直觉上我觉得想说 Suit = Card.Suit.Spades

我可以将枚举移动到名为 CardInfo 的单独静态类中,该类仅包含这些枚举。如果我想不出别的办法,我认为这是最好的选择。

所以我想知道其他人在类似情况下做了什么。也很高兴知道为什么不允许这样做。也许 Eric Lippert 或其他人可以参与禁止它的决定?它似乎只会在类 产生歧义,这可以通过强制使用 this.Suit 作为属性名称来解决。 (类似于消除本地人和成员之间的歧义。)我认为这是由于 "every feature starts with -100 points" 而被排除在外的。事情,但我很好奇关于这个的讨论。

最佳答案

It would also be nice to know why this is disallowed. Maybe Eric Lippert or someone could chime in on the decision to forbid it?

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

对这条规则做出异常(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/

相关文章:

c# - 读取嵌入为资源的 .txt

c# - 如何配置 swashbuckle 以显示 api 版本而不是 v{version} 变量?

c# - 具有足够精度以实现计算器的数字类型

c++ - 常量和枚举

c# - wpf如何删除矩形(角)线形式边框

c# - 你可以在 c# 中的只读结构上设置默认参数吗?

c# - 高效实现 "ThenBy"排序

c# - 用 C# 通过 Pinvoke 读取 DVD 的特定扇区

java - 默认枚举方法

java - 非常基本的东西 : having trouble with a program simulating a slot machine- enums and arrays