[英]Why does this C# code throw an error: Use of unassigned local variable 'n'
在 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);
}
C# 编译器不允许使用未初始化的变量。 如果编译器检测到使用了可能尚未初始化的变量,则会生成编译器错误 CS0165。 有关更多信息,请参阅字段。 请注意,当编译器遇到可能导致使用未赋值变量的构造时,会生成此错误,即使您的特定代码没有。 这避免了确定分配的过于复杂的规则的必要性。
更何况,想象一下这种情况
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 中遇到编译器错误时,您可以单击错误代码,有时(如果幸运的话)它会为您提供有关错误含义的更简洁的信息
我相信,您感到困惑的是,即使变量n
似乎已初始化,为什么编译器会抱怨它没有初始化?
这是有充分理由的; 即使n
在某一时刻初始化,它也不会在所有可能的路径中初始化。 换句话说,您必须考虑代码中的每个场景,并确保在所有场景中都进行了初始化。
但在这种情况下,它不满足该条件。 在您的try
块中,如果在程序执行之前出现异常,则n = 123;
行,程序将转到catch
,然后转到您的Console.Write(n)
行,此时您正在尝试打印未初始化的变量。
因此,防止这种情况的最佳方法是在try
块之前初始化变量。 通常,建议您始终在声明变量后立即对其进行初始化。
从初学者的角度来看,您可能会争辩说try
块中只有一行代码,因此程序不可能不执行初始化。 但是你必须从编译器的角度来看待它; 它不理解你的程序的意图,它只是验证(这就是编译器所做的)程序是否是根据一组预定义的规则编写的。 在这种情况下,它不是。
如果你看这篇文章,你会看到答案:
// 错误:使用未赋值的局部变量“n”。
当你写int n;
您不初始化变量并尝试在Console.Write(n);
使用它Console.Write(n);
,所以你会得到编译错误: https : //ideone.com/q3LXwl
此错误是因为您在Console.Write()
函数中使用了n
。 并假设如果Try
块生成异常,则n
不会被初始化。 因此发生此错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.