【问题标题】:Use of unassigned bool? local variable使用未分配的布尔值?局部变量
【发布时间】:2014-04-22 16:54:16
【问题描述】:

我有这个:

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

【问题讨论】:

  • 总得有人说。你为什么要让你的生活变得困难?有两个同名的变量似乎真的很受虐。更改布尔的名称? foreach 循环内部的变量与外部的不同。
  • 我正在对不再在我们公司工作的人编写的非常旧的应用程序进行一些更改。我无法更改整个代码,就目前而言,我停留在这一点上。也许您可以建议如何分配默认值或如何修改此 IF 语句?有什么想法吗?

标签: c# variables unassigned-variable


【解决方案1】:

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

 bool? pass = null;

【讨论】:

  • 它不能为空。但是如果我使用 pass = null 错误就会消失,但我在代码的另一部分有问题。无论如何,它不能为空。
  • 如果它“不能为空”,你为什么把它设为bool?
  • 布尔值? pass = null;foreach 解决问题之前。也感谢Мурзик先生!
【解决方案2】:

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

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

【讨论】:

  • 你是对的 this.pass 是这个方法所在类的成员。
  • 本地pass显然是分配的-在线pass = this.pass
  • 如果 ill use "bool? pass = null;" ill 的另一部分代码有问题。这不能为空。这个变量从数据库中读取。另外,我有这个“公共布尔?通过;”在顶部。
【解决方案3】:

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

确保在使用之前分配给本地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 包含您实际需要的值,恐怕这些是您唯一的选择。

【讨论】:

  • “在 foreach 范围之前定义 pass”完全解决了我的问题!非常感谢!
【解决方案4】:

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

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

【讨论】:

  • 那么,我如何在 if 中为 pass 赋值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 2015-11-09
  • 2012-05-18
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多