c# - 在条件中重新声明模式匹配变量的 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
为其他内容来修复。这个对吗?我误解了文档吗?
解决方案
您应该重写代码以使用 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 语句本身没有。
推荐阅读
- wildcard - Informatica Designer (9.6.1.) 自动链接通配符
- java - 当内部文本已知时,使用 Java 正则表达式从特定 HTML 标记内的属性中提取值
- matlab - 如何在 Simulink 中从两个相同的总线信号中进行选择?
- powershell - 如何使用powershell快速创建特定文件和目录的归档并维护结构
- c# - 使用键在 Azure 搜索索引中查找文档
- facebook - Facebook 工作选项卡集成
- excel - MS Excel 无法识别 MS Access Nz() 函数
- java - Android Studio 在运行期间显示此错误。错误:程序类型已存在:androidx.concurrent.futures.DirectExecutor
- android - 更改 firebase 中 listviewitems 的布尔值
- javascript - 输入的日期比较,客户端 MVC