使用未分配的布尔?局部变量

时间:2014-04-22 16:54:16

标签: c# variables unassigned-variable

我有这个:

   foreach (Software.dsBDD.list_table21 row in dataTable.Rows)
        {
            PictureBox box;
            MemoryStream stream;
            Panel panel;
            Label label;
            bool? pass;
            if (this.pass.HasValue && this.end)
            {
               pass = this.pass;
            }
            if ((pass.GetValueOrDefault() && pass.HasValue) || row.view_only)
        }

变量"传递"靠近" GetValueOrDefault"下划线为错误:"使用未分配的局部变量传递"。我不明白为什么这个变量是未分配的,因为在同一行中有" pass"靠近" HasValue"它被分配了。我的语法错误在哪里?!

4 个答案:

答案 0 :(得分:3)

您尝试在实际分配之前使用它。为其指定null。

 bool? pass = null;

答案 1 :(得分:2)

有条件地分配pass变量并不能为每种可能的情况安全地分配它。使用@ MyP3uK解决方案并将其分配到您声明的同一行的null

话虽这么说,你仍有可能混淆passthis.pass。我肯定会使用另一个名称作为局部变量。此外,选择bool?而不是bool对我来说似乎是错误的选择。

答案 2 :(得分:1)

您想要执行以下任一操作:

确保在使用之前分配给您的本地pass:在每次迭代时,本地pass都将恢复为null

   foreach (Software.dsBDD.list_table21 row in dataTable.Rows)
        {
            PictureBox box;
            MemoryStream stream;
            Panel panel;
            Label label;
            bool? pass = null; //this line has changed
            if (this.pass.HasValue && this.end)
            {
               pass = this.pass;
            }
            if ((pass.GetValueOrDefault() && pass.HasValue) || row.view_only)
        }

使用普通bool而不是可空的bool,在每次迭代时,本地pass将被设置为默认值,即false:

   foreach (Software.dsBDD.list_table21 row in dataTable.Rows)
        {
            PictureBox box;
            MemoryStream stream;
            Panel panel;
            Label label;
            bool pass; //this line has changed
            if (this.pass.HasValue && this.end)
            {
               pass = this.pass;
            }
            if ((pass.GetValueOrDefault() && pass.HasValue) || row.view_only)
        }

如果您需要在下一次迭代中使用上一次迭代中的值,请在foreach范围之前定义pass

   bool? pass = null; //this line has changed
   foreach (Software.dsBDD.list_table21 row in dataTable.Rows)
        {
            PictureBox box;
            MemoryStream stream;
            Panel panel;
            Label label;

            if (this.pass.HasValue && this.end)
            {
               pass = this.pass;
            }
            if ((pass.GetValueOrDefault() && pass.HasValue) || row.view_only)
        }

如果pass包含您实际需要的值,我担心这些是您唯一的选择。

答案 3 :(得分:0)

并不总是分配局部变量pass。如果输入if块,则仅在您的代码中分配。我可以说,这就是你要做的事情:

bool pass = this.pass.HasValue && this.end;
if (pass && row.view_only)