Enum可以包含其他枚举吗?

时间:2012-06-10 01:16:32

标签: c# silverlight enums ienumerable

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

5 个答案:

答案 0 :(得分: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) { ... }

答案 1 :(得分:2)

您键入的内容是合法的,但两个枚举都是相互独立的。

GameSuit枚举黑桃与CardsSuit枚举黑桃无关。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

Enum是一个特殊的类,具有特殊的行为。您无法直接继承此类,但只要您声明新的enum,它就会直接继承。

您无法从其他enum继承一个新的enum

你能做到这一点的唯一方法就是使用反射。但你没有得到你想做的事。这可以让你使用枚举使用Refletcion多远:

但我担心这不会影响你的目的。

答案 4 :(得分: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;
}