为什么不';t C#中的这段代码抛出了一个错误
本文关键字:错误 一个 代码 为什么不 段代码 | 更新日期: 2023-09-27 17:49:38
理想情况下,作为局部变量且未初始化的变量returnString
将无法使用,并且会出现编译时错误:
使用未分配的本地变量"returnString">
事实上,这是我在另一个背景下得到的。尽管如此,它仍然有效。为什么?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class a {
public static string testMethod(){
string returnString;
try
{
int a = 100;
int b = 0;
b = a / b;
returnString= Convert.ToString(a - b);
// return returnString;
}
catch (Exception ex)
{
return returnString = Convert.ToString(ex);
//throw ex;
}
return returnString;
}
}
class Program
{
static void Main(string[] args)
{
// a A = new a();
Console.WriteLine(a.testMethod());
Console.ReadKey();
}
}
}
在这种情况下,分解代码(使用发布模式(通常会有所帮助。以下是dotPeek生成的反编译源代码:
public static string testMethod()
{
try
{
int num1 = 100;
int num2 = 0;
int num3 = num1 / num2;
return Convert.ToString(num1 - num3);
}
catch (Exception ex)
{
return Convert.ToString((object) ex);
}
}
正如您所看到的,对于编译器来说,没有未初始化的变量。那么,它为什么要抱怨呢?
因为编译器知道它稍后会被分配。
这不会编译,因为在返回变量之前可能没有分配变量(例如,如果a==2(:
private string method(int a)
{
string result;
if (a == 1)
{
result = "2334234";
}
return result;
}
在我看来,通过函数的每条路径都返回一个初始化的变量。要么成功地将除法转换为零,要么由于将出现异常,将异常的值分配给变量。您总是会有一个正确分配的值,编译器会看到这一点。
您的代码设置returnString
if:
-
在
try/catch
块内设置returnString
变量之前,代码不会引发异常。 -
如果
try
块中的代码抛出异常,则将分配returnString
。
结论:returnString
变量不存在可以取消赋值的情况。