我正在做以下代码块,编译器抱怨未分配的局部变量,可以使用一些帮助来识别发生了什么。
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")"行,我不确定发生了什么。我想过为此使用开关,但这似乎也遇到了同样的问题。
有什么想法吗?
在声明字符串 strType 时,您必须分配一个值,例如
string strType = null;
更多详细信息:编译器错误 CS0165
这样做的原因是,在使用变量之前,您不会strType
变量分配给任何值。 根据 C# 编译器规则,必须先将变量分配给任何值,然后才能开始以任何方式使用它。
换句话说,应该足够了,在条件之前分配一个空字符串,例如狗屎:
strType = srting.Empty; //at least one value is already assigned!
while (rsData.Read())
{
.... //your code here
}
为什么会这样?避免歧义和不清晰的代码呈现。
更多关于这一点,请仔细阅读 Eric Lippert 的一篇小文章:为什么局部变量肯定是在无法访问的语句中分配的?
它抱怨是因为在 If 语句时变量没有任何值。
只是做string strType = "";
在使用局部变量之前,您应该为局部变量分配一些值。您可以在声明它的位置(在 while 块之前)初始化它:
var strType = ""; // or null
或者(如果您不希望 strType 记住它上次迭代的值),请确保它在读取器包含数据或存在 DbNull 时获得初始值
strType = rsData["TYPE"] == DBNull.Value ? "" : rsData["TYPE"].ToString().Trim();
此错误表示您之前未声明该变量。只需在 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 语句的排序略有不同,甚至可以避免将空值重新分配给变量。
很好,使用String.Empty;
string strType=String.Empty;