在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);
}
答案 0 :(得分:11)
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
将不会初始化。因此会发生此错误。