为啥此 C# 代码会引发错误:使用未分配的局部变量 'n'
Posted
技术标签:
【中文标题】为啥此 C# 代码会引发错误:使用未分配的局部变量 \'n\'【英文标题】:Why does this C# code throw an error: Use of unassigned local variable 'n'为什么此 C# 代码会引发错误:使用未分配的局部变量 'n' 【发布时间】:2018-12-11 07:06:57 【问题描述】:在 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);
【问题讨论】:
什么错误??对于初学者,您没有定义任何捕获 下次用 cmets 复制代码时,也要复制 cmets,至少尝试理解它们。 他们需要赋值让我们说如果在 try 块中发生某些事情并且 n 的值无法赋值,那么 n 的值将是什么,并研究 c# static void Main() 中的可为空类型 int n=0;尝试 n = 123; 捕捉 Console.Write(n); 这个问题应该重新打开,保留理由无效,是一个合法的问题 这能回答你的问题吗? Why did I get the compile error "Use of unassigned local variable"? 【参考方案1】:这个错误是因为你在Console.Write()
函数中使用了n
。并假设如果Try
块生成异常,那么n
将不会被初始化。因此会发生此错误。
【讨论】:
【参考方案2】:我相信,您感到困惑的是,即使变量 n
似乎已被初始化,为什么编译器会抱怨它不是?
这是有充分理由的;即使n
在某一时刻被初始化,它并没有在所有可能的路径中初始化。换句话说,您必须考虑代码中的每个场景,并确保在所有场景中都进行初始化。
但在这种情况下,它不满足该条件。在您的try
块中,如果在程序执行n = 123;
行之前出现异常,程序将转到catch
,然后在此之后,将转到您的Console.Write(n)
行,此时您'正在尝试打印一个未初始化的变量。
因此,防止这种情况的最佳方法是在 try
块之前初始化变量。一般来说,建议您始终在声明变量后立即对其进行初始化。
编辑
从初学者的角度来看,您可能会争辩说try
块内只有一行代码,因此程序不可能不执行初始化。但是你必须从编译器的角度来看它;它不理解你的程序的意图,它只是验证(这是编译器所做的)如果一个程序是根据一组预定义的规则编写的。在这种情况下,它不是。
【讨论】:
【参考方案3】: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 中遇到编译器错误时,您可以单击错误代码,有时(如果幸运的话)会为您提供有关错误含义的更简洁信息
【讨论】:
【参考方案4】:如果你看这篇文章,你会看到答案:
// 错误:使用未分配的局部变量“n”。
当你写int n;
时你没有初始化变量并尝试在Console.Write(n);
中使用它,所以你会得到编译错误:https://ideone.com/q3LXwl
【讨论】:
以上是关于为啥此 C# 代码会引发错误:使用未分配的局部变量 'n'的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我在函数中声明一个名称为全局数组的局部数组时,bash 会引发未绑定变量警告?
为啥从针对任何 CPU 的 C# 项目调用此代码时会引发 System.AccessViolationException?