首页 > 解决方案 > C# Visual Studio 错误使用未分配的局部变量

问题描述

我正在制作一个简单的程序,当单击按钮时,它会在标签中显示一张卡片

使用随机数生成器创建一个介于 1-4 之间的数字(并设置为红心、方块、梅花或黑桃)

还有另一个生成器,用于创建 1-13 之间的数字(然后设置为 ace、1、2、3、4、5、6、7、8、9、10、jack、queen、king)

然后使用 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;
    }

关于为什么它给我一个错误的任何想法?

标签: c#visual-studio

解决方案


您的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 和switches 中解脱出来。


推荐阅读