3

我正在执行以下代码块,编译器抱怨未分配的局部变量,并且可以使用一些帮助来确定发生了什么。

while (rsData.Read())
{
    if (rsData["TYPE"] != DBNull.Value)
        strType = rsData["TYPE"].ToString().Trim();


    if (strType == "01")
    {
        if (rsData["Text"] != DBNull.Value)
            strwho = rsData["Text"].ToString();

        if ((strwho.Length < 10 || (strwho.IndexOf("NULL") > 1)))
            strwho = "";
    }
    else if (strType == "07")
    {
        if (rsData["Text"] != DBNull.Value)
            strmetades = rsData["Text"].ToString();

        if ((strmetades.Length < 10 || (strmetades.IndexOf("NULL") > 1)))
            strmetades = "";
    }

它抱怨所有的 'if (strType == "01")' 行,我不确定发生了什么。我曾想过为此使用开关,但这似乎也遇到了同样的问题。

有任何想法吗?

4

6 回答 6

16

声明字符串 strType 时,您必须分配一个值,例如

string strType = null;

更多详细信息:编译器错误 CS0165

于 2012-05-04T13:20:57.440 回答
2

这样做的原因是您在使用之前strType没有将变量分配给任何值。根据 C# 编译器规则,您必须先将变量分配给任何值,然后才能开始以任何方式使用它。

换句话说,在条件之前分配一个空字符串就足够了,例如狗屎:

strType = srting.Empty; //at least one value is already assigned!

while (rsData.Read())
{
    .... //your code here
}

为什么这个?避免歧义和不清晰的代码表示。

更多关于这一点,直接阅读 Eric Lippert 的一篇小文章:为什么局部变量肯定在不可访问的语句中赋值?

于 2012-05-04T13:26:46.340 回答
0

在使用局部变量之前,您应该为其分配一些值。您可以在声明它的地方初始化它(在 while 块之前):

var strType = ""; // or null

或者(如果您不希望 strType 记住之前迭代的值),请确保它在 reader 包含数据或存在 DbNull 时都获得初始值

strType = rsData["TYPE"] == DBNull.Value ? "" : rsData["TYPE"].ToString().Trim();
于 2012-05-04T13:21:03.983 回答
0

它抱怨是因为在 If 语句时变量没有任何值。

做就是了string strType = "";

于 2012-05-04T13:21:38.997 回答
0

此错误意味着您之前没有声明该变量。只需在 while 循环的开头初始化这些变量。

例子:

while (rsData.Read())
{
    string strType = string.Empty;
    string strwho = string.Empty; // Do this if you have the same error for strwho
    string strmetades = string.Empty; // Do this if you have the same error for strmetades

    // Your other code comes here
}

如果您对 IF 语句的排序稍有不同,您甚至可以避免将空值重新分配给变量。

于 2012-05-04T13:23:07.993 回答
0

很好,使用 String.Empty;

string strType=String.Empty;
于 2012-05-04T13:33:19.023 回答