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

时间:2018-07-03 04:15:01

标签: c#

在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);  
}

4 个答案:

答案 0 :(得分:11)

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中遇到编译器错误时,您可以单击错误代码,有时(如果幸运的话)会为您提供有关错误含义的更简洁的信息

答案 1 :(得分:6)

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

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

但是在这种情况下,它不满足该条件。在您的n块中,如果程序执行try行之前发生异常,则程序将转到n = 123;,然后,将转到您的{{ 1}}行,此时您尝试打印未初始化的变量。

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


编辑

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

答案 2 :(得分:4)

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

  

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

在编写int n;时,您不会初始化变量,而是尝试在Console.Write(n);中使用它,因此会出现编译错误:https://ideone.com/q3LXwl

答案 3 :(得分:1)

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