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

C# 为什么case语句不允许我设置将在方法中使用的变量,c#,visual-studio-2010,case-statement,C#,Visual Studio 2010,Case Statement,我正在尝试使用case语句为名为“query”的变量赋值。根据组合框的值,查询的值将发生变化。我在方法中分配了“query”变量,只想在方法中使用它。我得到一条错误消息,“query”变量是未赋值的,即使它是在方法的顶部赋值的。我有一个工作,但我不知道为什么会发生这种情况?任何洞察都会有帮助 这是密码 public void ExportKml() { string query; switch (txtTable.SelectedIndex)

我正在尝试使用case语句为名为“query”的变量赋值。根据组合框的值,查询的值将发生变化。我在方法中分配了“query”变量,只想在方法中使用它。我得到一条错误消息,“query”变量是未赋值的,即使它是在方法的顶部赋值的。我有一个工作,但我不知道为什么会发生这种情况?任何洞察都会有帮助

这是密码

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();
}
public void ExportKml()
{
字符串查询;
开关(txtable.SelectedIndex)
{
案例0:
query=“从dbo.HyacinthWaterBodyZones中选择*”;
打破
案例1:
query=“从lchcd.privateWatersFinal中选择*,其中WaterodyPolyGon不为空”;
打破
案例2:
query=“从lchcd.publicWatersFinal中选择*,其中WaterModyPolyGon不为空”;
打破
}
cs.Open();

SqlCommand cmd=new SqlCommand(query,cs);如果所选索引不是0-2,则不会点击任何case语句。如果要在
开关中分配变量,则需要包含
默认值:
case

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;
}

您需要为
查询
指定一个初始值。
字符串。为空
。您的开关中还应包含一个
默认值
大小写。请参阅以下内容:

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();
    }
}

由于编译器无法知道您的
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();    
}
string query=string.Empty;
开关(…)
{
....
}
如果(query.Length>0)
{
cs.Open();

SqlCommand cmd=new SqlCommand(query,cs);虽然您选择的索引在逻辑上可能永远不是0、1或2以外的任何内容,但编译器无法知道这一点。您需要使用伪值初始化变量,或者添加一个将其设置为伪值的
case else
。可以使用
string.IsNullOrWhiteSpace(query)
?@SamLeach我不确定,在这种情况下,它似乎毫无意义,因为我已经知道字符串不是空的,调用方法似乎更昂贵,而属性应该更快。然而,这些只是微观优化。
default
案例不需要,他为什么要包括它?默认案例不需要,但它确实需要知道很有帮助。很容易修复,但它给了我一个headache@CodeSlinger,读@sam Leach,在我的例子中,默认值是不需要的,因为除非用户在组合框中选择一个项,否则该方法不会运行。因此,case station始终返回0到2之间的值。尽管如此,还是要提供帮助链接,谢谢!请确保编写一些测试来证明您的假设日期:)