枚举类型可以包含其他枚举类型吗?

6

枚举类型可以包含其他枚举元素以及自己的元素吗?

public enum CardSuit
{
    spades,
    hearts,
    diamonds,
    clubs 
}

public enum GameSuit
{
    spades,        //        These are 
    hearts,        //        the same
    diamonds,      //      " CardSuit "
    clubs,         //        elements

    suns    //             " GameSuit " special element
}

我们能否在GameSuit中包含CardSuit,而不需要重复输入相同的元素?
5个回答

4

遗憾的是,使用枚举并没有一个好的解决方案来满足你想要的。你可以尝试其他选项,例如一系列特定“类似于枚举”的public static readonly字段:

public class CardSuit 
{
    public static readonly CardSuit Spades = new CardSuit();
    public static readonly CardSuit Hearts = new CardSuit();
    ...
}

public enum GameSuit : CardSuit 
{
    public static readonly GameSuit Suns = new GameSuit();
}

实际上,这样做可以基本正常工作,但是没有switch语句的支持。使用方法可能如下:

var cardSuit = ...;
if (cardSuit == CardSuit.Spades || cardSuit == GameSuit.Suns) { ... }

2
你所输入的内容是合法的,但两个枚举类型是独立的。 GameSuit 枚举类型中的 spades 与 CardsSuit 枚举类型中的 spades 没有关联。

+1 GameSuit枚举中的spades与CardsSuit枚举中的spades没有任何联系。 - Ahmed Ghoneim

2

您可以明确地从一个枚举类型传递值到另一个枚举类型:

public enum Foo { a, b, c }
public enum Bar { a = Foo.a, b = Foo.b, c = Foo.c + 3, d }

那在实践中行不通。当Foo foo = Bar.d无法编译时,这有什么意义呢?(更不用说Foo.c + 3相当丑陋了) - Kirk Woll
@KirkWoll - 我不会期望 Bar.d 能够分配给 Foo 的实例。 - HABO
好的,我明白。那么……如果你不能用“扩展”枚举替换原始枚举,这有什么意义呢?你只剩下两个相似但在语法上没有联系的枚举了。 - Kirk Woll
@KirkWoll - 请原谅。当OP问“我们是否可以在GameSuit中包含CardSuit而不会重复输入相同的元素”时,我认为他们想要创建一个新类型。不幸的是,以下代码不会抛出异常:public enum Foo { a, b, c } public enum Bar { a = Foo.a, b = Foo.b, c = Foo.c, d } Foo foo = Foo.b; Bar bar = (Bar)(int)foo; bar = Bar.d; foo = (Foo)(int)bar; - HABO

1
不必放弃开关支持。您可以通过设置起始整数值来考虑各种其他枚举类型。
const int baseOfCardSuit = 0;
const int baseOfGameSuit = 4;

public enum CardSuit
{
    spades = baseOfCardSuit,
    hearts, // 1
    diamonds, // 2
    clubs // 3
};

public enum GameSuit
{
    suns = baseOfGameSuit
};

将无效的枚举值转换不会修改整数值。
GameSuit a = (GameSuit) CardSuit.spades;
Console.WriteLine(a); // "0"
CardSuit b = (CardSuit) GameSuit.suns;
Console.WriteLine(b); // "4"

因此枚举类型是可互换的。

int value = 4; // "GameSuit.*"
switch((CardSuit)value) 
{
  case CardSuit.spades:
  case CardSuit.hearts:
  case CardSuit.diamonds:
  case CardSuit.clubs:
     Console.WriteLine("CardSuit.*");
     break;
  default: 
     switch((GameSuit)value) 
     {
         case GameSuit.sums:
            Console.WriteLine("GameSuit.*");
            break;
         default:
            Console.WriteLine("Err: value not found");
            break;  
     }
   break;
}

0

枚举是一种特殊的类,具有特殊的行为。您不能直接继承此类,但每当声明一个新的enum时,它都会间接继承。

您不能从其他enum继承一个新的enum

唯一的方法是使用反射来实现这样的操作。但是您无法得到想要做的内容。这就是使用枚举进行反射的限制:

但恐怕这并不符合您的目的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接