C # Visual Studio ошибка использования неназначенной локальной переменной - PullRequest
0 голосов
/ 25 ноября 2018

Я делаю простую программу, которая при нажатии кнопки отображает карточку с меткой

Используя генератор случайных чисел, чтобы создать число от 1 до 4 (и установить либо сердца, алмазы, булавыили лопаты)

также еще один генератор, чтобы создать число от 1 до 13 (а затем установить либо туз, 1,2,3,4,5,6,7,8,9,10, Джек,королева, король)

затем с помощью оператора if установить костюм, который называется

, а затем с помощью оператора switch установить карту на соответствующую карту

, но я получаюошибка:

Ошибка CS0165 при попытке собрать мою программу

вот моя программа:

форма программы 1

здесьмой код:

public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Random myRandom = new Random();
        int suitNo, cardNo;
        string suit, card;

        suitNo = myRandom.Next(1, 4);
        cardNo = myRandom.Next(1, 13);

        if (suitNo == 1)
        {
            suit = "Hearts";
        }
        if (suitNo == 2)
        {
            suit = "Diamonds";
        }
        if (suitNo == 3)
        {
            suit = "Clubs";
        }
        if (suitNo == 4)
        {
            suit = "Spades";
        }

        switch (cardNo)
        {
            case 1:
                card = "Ace";
                break;
            case 2:
                card = "Two";
                break;
            case 3:
                card = "Three";
                break;
            case 4:
                card = "Four";
                break;
            case 5:
                card = "Five";
                break;
            case 6:
                card = "Six";
                break;
            case 7:
                card = "Seven";
                break;
            case 8:
                card = "Eight";
                break;
            case 9:
                card = "Nine";
                break;
            case 10:
                card = "Ten";
                break;
            case 11:
                card = "Jack";
                break;
            case 12:
                card = "Queen";
                break;
            case 13:
                card = "King";
                break;
        }

        label1.Text = "Your card is a " + card + " of " + suit;
    }

есть идеи, почему он дает мне ошибку?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Костюм и карта могут быть оставлены без присмотра, если речь идет о компиляторе.Вы скажете «нет», так как у вас всегда есть 4 масти и 13 карт, но компилятор не знает, как играть в игру.Простой обходной путь - инициализация переменной в ее объявлении.- Ганс Пассант 9 часов назад

инициализация переменной строки масти и карты в начале исправила мою ошибку,

У вас также есть ошибка в ваших аргументах для Random.Next,Из-за этой ошибки вы никогда не получите King of Spades :-( (Проверьте документацию: docs.microsoft.com/en-gb/dotnet/api/…) - elgonzo 9 часов назад

также изменение myRandom.Next с 1,4 и 1,13 на 1,5 и 1,14 означало, что теперь я отображаю все карты, как отметили @elgonzo, 1,4 и 1,13 означают, что нет пикового королябудет нарисован не только король пиков, но и король всех мастей, и весь костюм пики не будет разыгран - пока я не изменил верхний предел на 1,5 и 1,14

см. рабочий кодниже:

public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Random myRandom = new Random();
        int suitNo, cardNo;
        string suit = "", card = "";

        suitNo = myRandom.Next(1, 5);
        cardNo = myRandom.Next(1, 14);

        if (suitNo == 1)
        {
            suit = "Hearts";
        }
        if (suitNo == 2)
        {
            suit = "Diamonds";
        }
        if (suitNo == 3)
        {
            suit = "Clubs";
        }
        if (suitNo == 4)
        {
            suit = "Spades";
        }

        switch (cardNo)
        {
            case 1:
                card = "Ace";
                break;
            case 2:
                card = "Two";
                break;
            case 3:
                card = "Three";
                break;
            case 4:
                card = "Four";
                break;
            case 5:
                card = "Five";
                break;
            case 6:
                card = "Six";
                break;
            case 7:
                card = "Seven";
                break;
            case 8:
                card = "Eight";
                break;
            case 9:
                card = "Nine";
                break;
            case 10:
                card = "Ten";
                break;
            case 11:
                card = "Jack";
                break;
            case 12:
                card = "Queen";
                break;
            case 13:
                card = "King";
                break;
        }

        label1.Text = "Your card is a " + card + " of " + suit;
0 голосов
/ 25 ноября 2018

Ваше предложение switch не обеспечивает регистр default, и поэтому компилятор не может статически определить, что значение всегда будет присвоено card.Хотя на практике cardNo будет между 1 и 13, это невозможно проверить без запуска программы.

То же самое относится и к suit, конечно.

Или инициализируйте значения suit и card перед предложением switch или создайте случай default.

- хорошая практика, когда вы не ожидаете никаких других значений, кроме тех, для которых вы кодировалиэто обеспечить default случай, в котором вы просто выбрасываете исключение или Debug.Assert(false).

Более простая структура в целом будет состоять в определении

private static readonly string[] suits = { "Hearts", "Diamonds", "Clubs", "Spades" };
private static readonly string[] cards = { "Ace", ... , "King" };

И тогда ваш метод может быть в принципеуменьшено до:

int suitNo = myRandom.Next(suits.Length);
int cardNo = myRandom.Next(cards.Length);
string suit = suits[suitNo];
string card = cards[cardNo];

И освободи себя от многословия if s и switch es.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...