为什么不';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();
        }
    }
}

为什么不';t C#中的这段代码抛出了一个错误

在这种情况下,分解代码(使用发布模式(通常会有所帮助。以下是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:

  1. try/catch块内设置returnString变量之前,代码不会引发异常。

  2. 如果try块中的代码抛出异常,则将分配returnString

结论:returnString变量不存在可以取消赋值的情况。

相关文章: