【问题标题】:Why does this C# code throw an error: Use of unassigned local variable 'n'为什么此 C# 代码会引发错误:使用未分配的局部变量 'n'
【发布时间】:2018-12-11 07:06:57
【问题描述】:

在 MSDN 上,此代码发布在 https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-catch 我无法理解为什么会引发错误:

使用未赋值的局部变量“n”。

static void Main()   
{  
    int n;  

    try   
    {  
        // Do not initialize this variable here.  
        n = 123;  
    }  
    catch  
    {  
    }  

    // Error: Use of unassigned local variable 'n'.  
    Console.Write(n);  
}

【问题讨论】:

  • 什么错误??对于初学者,您没有定义任何捕获
  • 下次用 cmets 复制代码时,也要复制 cmets,至少尝试理解它们。
  • 他们需要赋值让我们说如果在 try 块中发生某些事情并且 n 的值无法赋值,那么 n 的值将是什么,并研究 c# static void Main() 中的可为空类型{ int n=0;尝试 { n = 123; } 捕捉 { } Console.Write(n); }
  • 这个问题应该重新打开,保留理由无效,是一个合法的问题

标签: c#


【解决方案1】:

这个错误是因为你在Console.Write()函数中使用了n。并假设如果Try 块生成异常,那么n 将不会被初始化。因此会发生此错误。

【讨论】:

    【解决方案2】:

    我相信,您感到困惑的是,即使变量 n 似乎已被初始化,为什么编译器会抱怨它不是?

    这是有充分理由的;即使n 在某一时刻被初始化,它并没有在所有可能的路径中初始化。换句话说,您必须考虑代码中的每个场景,并确保在所有场景中都进行初始化。

    但在这种情况下,它不满足该条件。在您的try 块中,如果在程序执行n = 123; 行之前出现异常,程序将转到catch,然后在此之后,将转到您的Console.Write(n) 行,此时您'正在尝试打印一个未初始化的变量。

    因此,防止这种情况的最佳方法是在 try 块之前初始化变量。一般来说,建议您始终在声明变量后立即对其进行初始化。


    编辑

    从初学者的角度来看,您可能会争辩说try 块内只有一行代码,因此程序不可能不执行初始化。但是你必须从编译器的角度来看它;它不理解你的程序的意图,它只是验证(这是编译器所做的)如果一个程序是根据一组预定义的规则编写的。在这种情况下,它不是。

    【讨论】:

      【解决方案3】:

      Compiler Error CS0165

      C# 编译器不允许使用未初始化的变量。如果 编译器检测到可能没有使用的变量 初始化,它会生成编译器错误 CS0165。了解更多信息, 见Fields。注意编译时会产生这个错误 遇到一个可能导致使用未赋值的构造 变量,即使您的特定代码没有。这避免了 明确分配的必要性过于复杂。

      更是如此,想象一下这种情况

      int n;  
      
      try   
      {  
          throw new Exception();
          n = 123;  // this code is never reached
      }  
      catch  
      {  
      }  
      
      // oh noez!!! bam!
      // The compiler is trying to be nice to you 
      if(n == 234);
      

      简而言之,计算机说不

      注意:当您在 Visual Studio 中遇到编译器错误时,您可以单击错误代码,有时(如果幸运的话)会为您提供有关错误含义的更简洁信息

      【讨论】:

        【解决方案4】:

        如果你看这篇文章,你会看到答案:

        // 错误:使用未分配的局部变量“n”。

        当你写int n;时你没有初始化变量并尝试在Console.Write(n);中使用它,所以你会得到编译错误:https://ideone.com/q3LXwl

        【讨论】:

          猜你喜欢
          • 2012-03-03
          • 2014-05-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多