Ошибка C#: использование неназначенной локальной переменной

ошибка вызвана в цикле for:

for (i = 0; i < hand.Length; i++)
{
   Console.WriteLine(hand[i]);
}

Я пытаюсь сохранить значения, чтобы иметь возможность отображать их позже. Writeline помогает мне убедиться, что код действительно работает так, как я намереваюсь.

остальная часть кода для справки: * edit: добавлена строка кода

enum house //variable type for the card type
{
    Spades, Hearts, Clubs, Diamonds
}

enum cards //variable type for the cards
{
    Joker, Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King
}

class Program
{
    static void Main(string[] args)
    {

        Random rnd;
        Random rnd2;

        int i;
        int random;
        int random2;

        String[] hand;

        house randomhouse;
        cards randomcard;

        //all declared variables

        Console.WriteLine("Your hand is made up of :");

        for (i = 0; i <= 6; i++)//does everything in the {} until i is equal to 6
        {

            rnd2 = new Random();
            random2 = rnd2.Next(0, 14);
            randomcard = (cards)random2; //selecting a random card from joker to king

            if (randomcard > (int)cards.Joker) //if the random card isn't a joker
            {
                rnd = new Random();
                random = rnd.Next(0, 4);
                randomhouse = (house)random;//selects a random card type

                Console.WriteLine(randomcard + " of " + randomhouse); //outputs the name of the card
                System.Threading.Thread.Sleep(1000);//wait 1 second before getting the new card
            }

            else
            {
                Console.WriteLine(randomcard);//outputs "Joker"
                System.Threading.Thread.Sleep(1000);//wait 1 second before getting the new card
            }

            hand = new String[i];//making a new array value for every loop
            hand[i] = randomcard.ToString();//adding randomcard to the array*

        } 

        Console.Clear();

        for (i = 0; i < hand.Length; i++)
        {
            Console.WriteLine(hand[i]);
        }

        Console.ReadKey();
    }
}

2 ответов


компилятор никогда не может быть уверен, что hand на самом деле инициализируется. Вы должны либо инициализировать его раньше, либо установить его в null, Так что вы обойти эту проверку.

так что вы могли бы сделать это, но это на самом деле плохая практика! При изменении кода Вы можете получить NullReferenceException!

String[] hand = null;

вы знаете, что ваш код на самом деле не работает, так как в конечном итоге вы получаете один массив. Я думаю, вы имеете в виду следующее:

hand = new String[6];

...

hand[i] = theValue;

массивы в c# не являются динамическими. Вам нужно вручную изменить их размер, чтобы добавить что-либо в них. Инициализируйте руку вне цикла for. Со стартовой руке 6 карт вы можете назначить.

string[] hand = new string[6];

Если добавлены новые карты, вы можете использовать:

Array.Resize(ref hand, (i + 1));