为什么case语句不允许我设置将在方法中使用的变量

时间:2013-09-19 15:43:53

标签: c# visual-studio-2010 case-statement

我试图使用case语句为名为“query”的变量赋值。根据comboBox的值,查询的值将更改。我在我的方法中分配了“查询”变量,并且只想在方法中使用它。我收到一条错误消息,即“查询”变量未分配,即使它被分配在方法的顶部。我有一个解决方法,但我不知道为什么会这样?任何见解都会有所帮助。

继承人的代码。

public void ExportKml()
    {
        string query;

            switch (txtTable.SelectedIndex)
            {
                case 0:
                    query = "Select * from dbo.HyacinthWaterBodyZones";
                    break;
                case 1:
                    query="Select * from lchcd.privateWatersFinal where waterbodypolygon is not null";
                    break;
                case 2:
                    query = "Select * from lchcd.publicWatersFinal where waterbodypolygon is not null";
                    break;

            }

            cs.Open();
            SqlCommand cmd = new SqlCommand(query, cs);   <<--Error Message 
            SqlDataReader polygon = cmd.ExecuteReader();
}

行内的“查询”变量:     SqlCommand cmd = new SqlComman(query,cs) 给出一个错误,指出它是未分配的局部变量。

3 个答案:

答案 0 :(得分:3)

您需要为query分配初始值。 ""string.Empty。您还应该在交换机中包含default个案例。见下文:

public void ExportKml()
{
    string query = string.Empty;

    switch (txtTable.SelectedIndex)
    {
        case 0:
            query = "Select * from dbo.HyacinthWaterBodyZones";
            break;
        case 1:
            query = "Select * from lchcd.privateWatersFinal where waterbodypolygon is not null";
            break;
        case 2:
            query = "Select * from lchcd.publicWatersFinal where waterbodypolygon is not null";
            break;
        default:
            query = "";
            break;
    }

    // Add a check for empty string before trying the query.
    if(!string.IsNullOrWhiteSpace(query))
    {
        cs.Open();
        SqlCommand cmd = new SqlCommand(query, cs);
        SqlDataReader polygon = cmd.ExecuteReader();
    }
}

答案 1 :(得分:3)

因为编译器无法知道你的SelectedIndex是否总是0,1或2,所以它给你一个强烈的建议来初始化在开关之前定义但在它之后使用的变量

string query = string.Empty;
switch(.....)
{
    ....
}
if(query.Length > 0)
{
    cs.Open();
    SqlCommand cmd = new SqlCommand(query, cs);   <<--Error Message 
    SqlDataReader polygon = cmd.ExecuteReader();    
}

向switch语句添加默认大小写也有效,但是,就个人而言,我更喜欢在输入switch语句之前初始化查询变量。对我来说更清楚,并且不太容易忘记其他一些重要的初始化

答案 2 :(得分:2)

如果所选索引不是0-2,则不会遇到任何case语句。如果要在default:中分配变量,则需要包含switch个案。

switch (txtTable.SelectedIndex)
{
    case 0:
        query = "Select * from dbo.HyacinthWaterBodyZones";
        break;
    case 1:
        query="Select * from lchcd.privateWatersFinal where waterbodypolygon is not null";
        break;
    case 2:
        query = "Select * from lchcd.publicWatersFinal where waterbodypolygon is not null";
        break;
    default:
        //assign query = something here
        break;
}