0

我有这个:

   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”下划线表示错误:“Use of unassigned local variable pass”。我不明白为什么这个变量没有被赋值,因为在同一行中,“HasValue”附近有“pass”并且它被赋值了。我的语法错误在哪里?!

4

4 回答 4

5

您正在尝试在实际分配它之前使用它。将 null 分配给它。

 bool? pass = null;
于 2014-04-22T16:57:09.137 回答
2

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

话虽如此,您仍然面临混淆passthis.pass. 我肯定会为局部变量使用另一个名称。此外,在这里选择bool?bool我来说似乎是错误的选择。

于 2014-04-22T16:55:27.413 回答
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 而不是可以为 null 的,在每次迭代时本地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)
        }

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

   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 包含您实际需要的值,恐怕这些是您唯一的选择。

于 2014-04-22T17:28:44.257 回答
0

局部变量pass并不总是被赋值。if如果输入了块,它只会在您的代码中分配。据我所知,这就是你想要做的:

bool pass = this.pass.HasValue && this.end;
if (pass && row.view_only)
于 2014-04-22T17:03:10.453 回答