Enum 可以包含其他 Enum 吗?

问题描述 投票:0回答: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
}

我们可以将 CardSuit 包含在 GameSuit 中,而无需重复输入相同的元素吗?

c# silverlight enums ienumerable
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
投票

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

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

2
投票

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

GameSuit
枚举黑桃与
CardsSuit
枚举黑桃没有任何关系。


1
投票

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

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
继承一个新的
enum

做类似事情的唯一方法是使用反射。但你没有得到你想做的事。这可以让您使用带有枚举的 Refletcion 走多远:

但恐怕这达不到你的目的。

© www.soinside.com 2019 - 2024. All rights reserved.