【问题标题】:Use of unassigned local variable error #2使用未分配的局部变量错误 #2
【发布时间】:2012-09-24 19:39:21
【问题描述】:

我查看了 google 和其他 stackoverflow Use of unassigned local variable 错误,但仍然找不到答案。我认为也许我的错误是因为滥用了 ExtractionCtrl 的范围。我尝试了这段代码来测试范围并且它有效。所以我现在不知道我的错误在哪里。

测试范围

namespace RandomTesting
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            int x = 5;

            switch (x)
            {
                case 2:
                    System.Console.WriteLine("Your # is 2");
                    break;

                case 5:
                    System.Console.WriteLine("Your # is :{0}", x);
                    x = x + 2;
                    System.Console.WriteLine("Your # is :{0}", x);
                    break;
            }

            System.Console.WriteLine("Your # is :{0}", x);
            Console.ReadLine();
        }
    }
}

部分主要代码

switch (arg)
{
    case "AR":
        ExtractionCtrl = new ARExtractionController();

        // add new mapping here
        break;

    case "ICN":
        ExtractionCtrl = new IcnExtractionController();

        // add new mapping here
        break;
}

int ticketID;
if (int.TryParse(arg, out ticketID))
{
    string returnedFilePath = ExtractionController.GetStartupPath();
    ExtractionCtrl.Extract(ticketID, returnedFilePath, AR_TEMPLATE_PATH, MAPPING_PATH);
}

【问题讨论】:

  • arg 的值实际上是“AR”还是“ICN”?注意区分大小写。
  • 你在哪里得到错误?如果是因为 ExtractionCtrl 未分配,那么请发布代码,说明它的定义位置和赋值位置
  • 如果arg的值是AR或者ICN,你为什么要做int.TryParse?不会总是假的吧?
  • -arg is "AR" - int.Tryparse : 我知道,对不起,我正在尝试修改别人的代码

标签: c# .net variables scope


【解决方案1】:

您设置 ExtractionCtrl 的开关没有默认情况,因此在切换后 ExtractionCtrl 可能未初始化。由于您没有显示 ExtractionCtrl 的声明,我假设它是在没有初始化的情况下声明的:

SomeExtractionCtrlType ExtractionCtrl;

因此错误。

【讨论】:

  • 谢谢!,哇,我在 stackoverflow 上发布愚蠢的问题感到愚蠢和内疚。
【解决方案2】:

您很可能需要在您的 switch 中添加一个 default 块。

switch (arg)
{
    case "AR":
        ExtractionCtrl = new ARExtractionController();

        // add new mapping here
        break;

    case "ICN":
        ExtractionCtrl = new IcnExtractionController();

        // add new mapping here
        break;
    default:
        ExtractionCtrl = new DefaultExtractionController();
        break;
}

或者您可以在定义 ExtractionCtrl 时对其进行初始化。不过,我更喜欢default 选项。

【讨论】:

  • 如果这种情况永远不会发生,您可以throw 那里的异常。编译器会明白,如果发生这种情况,您将永远无法访问将使用该变量的代码。
  • 好吧,但我根本不知道他的业务规则。
  • 我并不是说他必须抛出异常,只是说如果没有任何可接受的默认值,它是使用默认值的可行替代方案。
  • 但是我现在不需要它,我专注于错误消息。 arg 是 AR
  • 没关系,编译器看到有些情况下你没有初始化ExtractionCtrl,这就是它抱怨的原因。如果这是一个运行时错误,并且arg 被设置为“AR”,那么你会没事的。但这是一个编译时错误,所以你必须初始化它。
【解决方案3】:

在 Visual Studio 中,这是一个非常常见的编译时错误,这意味着编译器认为变量在被调用之前可能不会被初始化。您应该做的是添加一个default 案例,正如其他答案所说,但也要在声明变量时将其初始化为null,或您在default 中设置的值。不幸的是,Visual Studio 非常挑剔,它并没有看到所有潜在的路径最终都会授予一个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2010-11-17
    • 2018-12-19
    • 1970-01-01
    相关资源
    最近更新 更多