5

Enum 可以包含其他 Enum 元素以及它自己的元素吗?

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 而不需要重复输入相同的元素吗?

4

5 回答 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) { ... }
于 2012-06-10T01:21:59.290 回答
2

您输入的内容是合法的,但两个枚举彼此独立。

GameSuitenum spades 与 enum spades 无关CardsSuit

于 2012-06-10T01:21:50.810 回答
1

您可以将值从一种枚举类型显式传递到另一种枚举类型:

public enum Foo { a, b, c }
public enum Bar { a = Foo.a, b = Foo.b, c = Foo.c + 3, d }
于 2012-06-10T01:30:21.803 回答
0

Enum 是一个特殊的类,具有特殊的行为。你不能直接继承这个类,但是任何时候你声明一个 new 时它都是不正确的继承者enum

你不能enum从另一个继承一个新的enum

你可以做这样的事情的唯一方法是使用反射。但是你没有得到你想做的事。这可以使您将Refletcion与枚举一起使用多远:

但恐怕这不符合你的目的。

于 2012-06-10T01:42:12.120 回答
0

没有必要放弃开关支持。您可以通过设置起始整数值来考虑各种其他枚举类型。

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;
}
于 2018-03-18T14:47:26.250 回答