为啥此 C# 代码会引发错误:使用未分配的局部变量 'n'

Posted

技术标签:

【中文标题】为啥此 C# 代码会引发错误:使用未分配的局部变量 \'n\'【英文标题】: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); 这个问题应该重新打开,保留理由无效,是一个合法的问题 这能回答你的问题吗? Why did I get the compile error "Use of unassigned local variable"? 【参考方案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

【讨论】:

以上是关于为啥此 C# 代码会引发错误:使用未分配的局部变量 'n'的主要内容,如果未能解决你的问题,请参考以下文章

C#未分配的局部变量错误

为啥当我在函数中声明一个名称为全局数组的局部数组时,bash 会引发未绑定变量警告?

使用空分配修复“使用未分配的局部变量”。为啥?

“使用未分配的局部变量”错误的原因是啥? [复制]

为啥从针对任何 CPU 的 C# 项目调用此代码时会引发 System.AccessViolationException?

为啥受保护的构造函数会在此代码中引发错误?