5

列挙型には、他の列挙型要素と独自の要素を含めることができますか?

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に含めることはできますか?

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

入力した内容は合法ですが、両方の列挙型は互いに独立しています。

GameSuit列挙型スペードは列挙型スペードとは関係ありません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

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 に答える