在MSDN上,这段代码是在https://learn.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);
}发布于 2018-07-03 04:18:33
C#编译器不允许使用未初始化的变量。如果编译器检测到可能尚未初始化的变量的使用,则会生成编译器错误CS0165。有关更多信息,请参见字段。请注意,当编译器遇到可能导致使用未分配变量的构造时会生成此错误,即使您的特定代码没有,也是如此。这就避免了对明确的转让制定过于复杂的规则的必要性。
More-所以,想象一下这种情况
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中获得编译器错误时,您可以单击错误代码,它有时(如果幸运的话)会给您提供更简洁的信息,说明错误的含义。
发布于 2018-07-03 04:27:13
我相信,您所困惑的是,即使变量n看起来是初始化的,为什么编译器会抱怨它没有呢?
这有一个很好的理由;即使n是在某个点初始化的,但它并不是在所有可能的路径中初始化的。换句话说,您必须对代码中的每个场景进行说明,并确保在所有这些场景中都会进行初始化。
但在这种情况下,它不满足这个条件。在try块中,如果程序执行n = 123;行之前有异常,程序将转到catch,然后再转到Console.Write(n)行,此时您将尝试打印一个未初始化的变量。
因此,防止这种情况的最佳方法是在try块之前初始化变量。通常,建议您总是在声明变量时立即初始化它。
编辑
从初学者的角度来看,您可能会认为try块中只有一行代码,因此程序不可能不执行初始化。但是您必须从编译器的角度来看待它;它不理解您的程序的意图,它只是验证(这就是编译器所做的),如果程序是按照一组预定义的规则编写的。在这种情况下,事实并非如此。
发布于 2018-07-03 04:17:50
如果你看这篇文章,你会看到答案:
// Error:使用未分配的局部变量'n‘。
当您编写int n;时,您不会初始化变量并尝试在Console.Write(n);中使用它,因此您将得到编译错误:https://ideone.com/q3LXwl
https://stackoverflow.com/questions/51146590
复制相似问题