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 中,而无需重复输入相同的元素吗?
遗憾的是,没有,对于使用枚举的需求没有好的解决方案。您还可以尝试其他选项,例如特定“类似枚举”类型的一系列
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) { ... }
您可以显式地将值从一种枚举类型传递到另一种枚举类型:
public enum Foo { a, b, c }
public enum Bar { a = Foo.a, b = Foo.b, c = Foo.c + 3, d }
您输入的内容是合法的,但两个枚举彼此独立。
GameSuit
枚举黑桃与 CardsSuit
枚举黑桃没有任何关系。
没有必要放弃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;
}