【问题标题】:Why am I getting this Error in C# Compiler "Unassigned Local Variable" [duplicate]为什么我在 C# 编译器“未分配的局部变量”中出现此错误 [重复]
【发布时间】:2013-04-02 01:01:07
【问题描述】:

我收到以下错误。使用未分配的局部变量 markduplicate。我不明白为什么?该程序在数组中查找重复项。我一直试图弄清楚,我觉得我很接近。感谢您的帮助。

using System;

class duplicate 
{
    static void Main() 
    {
    const int Array_Size = 5;
    int [] number = new int [Array_Size];
    int i;

    for ( i = 0; i < Array_Size; i++) 
    {
        Console.Write("Element " + i + ":    ");
        number[i] = Int32.Parse(Console.ReadLine());
        if (number[i] < 9 || number[i] > 101)
        {
            Console.WriteLine("Enter Number between 10 - 100");
            number[i] = Int32.Parse(Console.ReadLine());
        }
    }

    bool markduplicate;
    for (i = 0; i < Array_Size; i++)
    {
        for (int j = 0; j < Array_Size; j++) 
        {
            if (i != j)
            {
                if (number[j] == number[i])
                {
                    markduplicate = true;
                }
            }

            if (markduplicate != true) 
            {
                Console.WriteLine("Element " + i + "    " + number[i]);
            }
        }
    }
}

}

【问题讨论】:

  • 因为并非所有通过循环的路径都将值分配给markduplicate。只需使用 false? 初始化它?
  • markDuplicate 在进入循环之前没有赋值。为它分配一个 False 的初始值,你应该没问题。
  • 这是一个旁白,但是你声明 i 超出循环范围有什么原因吗?
  • 另外,您可能需要稍微修改循环。假设您有数字 1,1 和 1。您将打印两次“Element 0 1”,然后打印两次“Element 1 1”,然后打印两次“Element 2 1”。我在外循环中声明markduplicate,并在内循环中设置markduplicate 后放置break 语句。我也将打印移到外循环,并改变 if 子句的含义。
  • edit 您的问题提供您收到的准确 错误消息,并用评论标记导致它的行。您面前有该特定信息;如果你提供它会容易得多。 :-)

标签: c# arrays compiler-errors duplicates unassigned-variable


【解决方案1】:

这是因为 C# 的代码分析器检测到存在通过您的程序的路径,而在对其进行任何分配之前将引用 markduplicate 的值。具体来说,这将在嵌套循环的第一次迭代中发生,此时ij 都为零:包含赋值的if (i != j) 块不会执行,因此@987654325 的值@ 将在下一个 if 语句中检索。

要解决此问题,请更改

bool markduplicate;

bool markduplicate = false;

在声明中。

【讨论】:

    【解决方案2】:

    编译器认为您可以在设置markduplicate 之前点击if (markduplicate != true) 行。

    如果您认为编译器错误,请在声明时给它一个值,例如bool markduplicate = true;。如果您分析并认为编译器是正确的,请相应地调整您的代码。

    另外:if (markduplicate != true) 被认为是糟糕的风格。请改用if(!markduplicate)

    【讨论】:

      【解决方案3】:

      您已经声明了布尔变量 markduplicate,但您没有给它一个初始值 - 编译器不知道它最初应该是真还是假。

      在这种情况下,很明显你希望它最初是假的,所以这样写:

      bool markduplicate = false;
      

      它现在将被编译。

      【讨论】:

        【解决方案4】:

        在您的代码中,(i != j) 在为真之前为假,因此您正在检查没有分配任何内容的变量的值。

        您需要在声明时为 markduplicate 分配一个值,或者您需要确保任何导致对其值进行条件检查的路径都首先分配了一个值。

        【讨论】:

          【解决方案5】:

          您必须在声明中将markdefault 分配给truefalse。否则,如果number [j] != number [i],则markdefault 将不会被赋值,if markduplicate != true 也无法计算。

          【讨论】:

            猜你喜欢
            • 2012-03-03
            • 1970-01-01
            • 2019-11-08
            • 1970-01-01
            • 2019-09-01
            • 1970-01-01
            相关资源
            最近更新 更多