首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这个C#代码抛出一个错误:使用未分配的局部变量'n‘

为什么这个C#代码抛出一个错误:使用未分配的局部变量'n‘
EN

Stack Overflow用户
提问于 2018-07-03 04:15:01
回答 4查看 3.8K关注 0票数 3

在MSDN上,这段代码是在https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-catch上发布的,我无法理解为什么它会抛出错误:

使用未分配的局部变量'n‘。

代码语言:javascript
运行
复制
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);  
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-07-03 04:18:33

编译器错误CS0165

C#编译器不允许使用未初始化的变量。如果编译器检测到可能尚未初始化的变量的使用,则会生成编译器错误CS0165。有关更多信息,请参见字段。请注意,当编译器遇到可能导致使用未分配变量的构造时会生成此错误,即使您的特定代码没有也是如此。这就避免了对明确的转让制定过于复杂的规则的必要性。

More-所以,想象一下这种情况

代码语言:javascript
运行
复制
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中获得编译器错误时,您可以单击错误代码,它有时(如果幸运的话)会给您提供更简洁的信息,说明错误的含义。

票数 11
EN

Stack Overflow用户

发布于 2018-07-03 04:27:13

我相信,您所困惑的是,即使变量n看起来是初始化的,为什么编译器会抱怨它没有呢?

这有一个很好的理由;即使n是在某个点初始化的,但它并不是在所有可能的路径中初始化的。换句话说,您必须对代码中的每个场景进行说明,并确保在所有这些场景中都会进行初始化。

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

因此,防止这种情况的最佳方法是在try块之前初始化变量。通常,建议您总是在声明变量时立即初始化它。

编辑

从初学者的角度来看,您可能会认为try块中只有一行代码,因此程序不可能不执行初始化。但是您必须从编译器的角度来看待它;它不理解您的程序的意图,它只是验证(这就是编译器所做的),如果程序是按照一组预定义的规则编写的。在这种情况下,事实并非如此。

票数 8
EN

Stack Overflow用户

发布于 2018-07-03 04:17:50

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

// Error:使用未分配的局部变量'n‘。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51146590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档