C#Visual Studio错误使用未分配的局部变量

时间:2018-11-25 11:08:46

标签: c# visual-studio

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

使用随机数生成器创建1-4之间的数字(并设置为心形,菱形,棍棒或黑桃)

另一个生成器可在1-13之间创建一个数字(然后将其设置为ace,1、2、3、4、5、6、7、8、9、10,jack,queen,king) >

然后使用if语句设置要调用的西装

然后使用switch语句将卡设置为其相应的卡

但是我收到一个错误:

尝试构建我的程序时出现错误CS0165

这是我的程序:

program form1

这是我的代码:

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 :(得分:3)

您的switch子句不提供default的情况,因此编译器无法静态推断出将始终分配值到card的情况。即使在实践中cardNo会介于113之间,但如果不运行该程序就无法进行验证。

suit当然也是如此。

要么在suit子句之前初始化cardswitch的值,要么创建一个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];

然后从冗长的ifswitch es中解脱出来。

答案 1 :(得分:-1)

  

就编译器而言,西装和卡片都可以不分配。您将说“没办法”,因为您总是有4套西服和13张卡,但是编译器不知道如何玩游戏。一个简单的解决方法是在变量的声明中对其进行初始化。 – 9小时前的汉斯·帕桑(

在开始时初始化变量字符串suit和card修复了我的错误,

  

您在Random.Next的参数中也有一个错误。由于此错误,您将永远不会得到黑桃王:-((检查文档:docs.microsoft.com/zh-cn/dotnet/api/…)– 9个月前的埃尔贡佐

还将myRandom.Next1,41,13更改为1,51,14意味着我现在显示了所有卡片,如@elgonzo指出的,{ {1}}和1,4表示不会抽出黑桃王,不仅会铲出黑桃王,而且不会抽出所有西装的王,也不会抽出整个黑桃之王-直到我将上限更改为{ {1}}和1,13

请参见下面的工作代码:

1,5