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