首页 > 解决方案 > 在条件中重新声明模式匹配变量的 C# 错误

问题描述

以下代码给出错误:“无法在此范围内声明名为 'ac' 的本地或参数,因为该名称在封闭的本地范围中用于定义本地或参数”。

    if (action is ActionRegisterNewDevice ac)
    {
        state = state.ShallowCopy();
        // Initialise the device to off
        state.DeviceOn[ac.ObjectId] = false;
    }
    else if (action is ActionOnMouseDown ac)
    {
        state = state.ShallowCopy();
        // toggle the state of the device
        state.DeviceOn[ac.ObjectId] = !DeviceSelectors.Device_is_on(state, ac.ObjectId);
    }

我的印象(显然是错误的)第一个条件是一个单独的范围。看起来模式匹配,即使是假的,仍然声明变量ac

但是文档说:

模式匹配表达式的语言规则可帮助您避免误用匹配表达式的结果。在上面的示例中,变量 s、c 和 r 仅在范围内,并且在各自的模式匹配表达式具有真实结果时明确分配。如果您尝试在其他位置使用任一变量,您的代码会生成编译器错误。

这个错误显然只能通过将第二个重命名ac为其他内容来修复。这个对吗?我误解了文档吗?

在此处输入图像描述

标签: c#unity3d

解决方案


您应该重写代码以使用 switch 语句来获得您想要的行为:

void Main()
{
    Print("Hello world");
    Print(42);
}

static void Print(object o)
{
    switch (o)
    {
        // Note that I am reusing the variable name "value" in each case.
        case string value:
            Console.WriteLine("STRING: " + value);
            break;

        case int value:
            Console.WriteLine("INT: " + value.ToString());
            break;
    }
}

要回答您为什么不能在 中执行此操作的问题,请if...else...在链接到的文档中对此进行说明:

变量 s 在方法 ComputeAreaModernIs 的范围内。这是因为 if 语句的每个分支都为变量建立了一个单独的范围。但是,if 语句本身没有。


推荐阅读