Как преобразовать int в значение перечисления?

Здесь мой код, который выдает ошибку, говоря Cannot convert type "int" to Cards.Suits и Cannot convert type "int" to Cards.Rank

private Card[] cards;
public Deck()
{
    cards = new Card[52];
    for (int suitVal = 0; suitVal < 4; suitVal++)
    {
        for (int rankVal = 0; rankVal < 14; rankVal++)
        {
            cards[suitVal * 13 + rankVal - 1] = new Card((Suits)suitVal, (Rank)rankVal);
        }
     }
}

конструктор карт

public readonly Suits suit;
public readonly Rank rank;
public Card(Suits newSuit, Rank newRank)
{
    suit = newSuit;
    rank = newRank;
}

Теперь перечисление Suum enum и Rank перечислены как обычная колода карт, начинающихся с ACE = 1 и далее, и костюмы - это DIAMONDS, CLUBS, HEARTS, SPADES. Может ли кто-нибудь сказать мне, почему я получаю вышеуказанную ошибку. Следующий код использовался в книге. Спасибо!

* EDIT

    public enum ranks
    {
        ACE = 1,
        TWO,
        THREE,
        FOUR,
        FIVE,
        SIX,
        SEVEN,
        EIGHT,
        NINE,
        TEN,
        JACK,
        QUEEN,
        KING,
    }

    public enum Suit
    {
        DIAMOND,
        CLUB,
        HEART,
        SPADE,
    }
+8
02 авг. '13 в 5:29
источник поделиться
4 ответа

В соответствии с вашими перечислениями перечисления Suit находится в диапазоне [0..3], а ранги находятся в диапазоне [1..13] (обратите внимание, что ранги не основаны на нулевом уровне), поэтому внутренний цикл следует исправить:

  for (int rankVal = 0; rankVal < 13; rankVal++) // <- 14 changed for 13: [0..13] has the same length as [1..14] 
  { 
    cards[suitVal * 13 + rankVal] = new Card((Suits)suitVal, (Rank)(rankVal + 1)); // <- removed -1 from index; add 1 to rankVal, we need [1..14], not [0..13]
    ...
+2
02 авг. '13 в 5:59
источник

измените свою строку так:

 cards[suitVal * 13 + rankVal] = new Card(((Suit)suitVal), ((ranks)rankVal));

и поскольку ваш класс принимает перечисления в конструкторе, измените его так:

public readonly Suit suit;
public readonly ranks rank;
public Card(Suit newSuit, ranks newRank)
{
    suit = newSuit;
    rank = newRank;
}
+1
02 авг. '13 в 5:46
источник

Я увижу, что он получит другую ошибку "Индекс находился за пределами массива"

Когда suitVal = 0 и rankVal = 0, карты [suitVal * 13 + rankVal - 1] = -1, которые являются пределами индекса массива.

0
02 авг. '13 в 6:06
источник

Это хорошо работает но исправьте это

    for (int suitVal = 0; suitVal < 4; suitVal++)
    {
        for (int rankVal = 0; rankVal < 14; rankVal++)
        {
            cards[suitVal * 13 + rankVal - 1] = new Card((Suit)suitVal, (Rank)rankVal);
        }
    }

Здесь

в карточках [suitVal * 13 + rankVal - 1]

[Loop 1:]
suitVal =0
rankVal=0

[suitVal * 13 + rankVal - 1] = [0 * 13 + 0-1] = [-1]! упс!

и в вашем prgm:

public readonly Suit  suit; //not Suits
public readonly ranks rank; //not Rank 
0
02 авг. '13 в 10:41
источник

Посмотрите другие вопросы по меткам или Задайте вопрос