C#条件语句中模式匹配变量重声明报错的原因及解决方法咨询
C#模式匹配同名变量编译错误的解决与疑问解答
你遇到的这个编译错误其实是C#作用域规则导致的,先给你明确结论:重命名第二个ac是完全正确的解决方式,咱们一步步理清楚原因,以及你对文档的误解点在哪里。
首先看你的代码:两个else if分支里都用了ac作为模式匹配的变量名,C#里模式匹配变量的作用域并不是单个if分支,而是整个封闭的if-else结构。也就是说,第一个分支里声明的ac,它的作用域覆盖了整个if-else块,所以第二个分支再用同名的ac就会触发“重复声明”的编译错误——这和你直觉里“每个分支是独立作用域”的想法不一样。
再来说你对文档的误解:文档里说“匹配成功时变量才处于作用域且已明确赋值,在其他位置使用会触发编译错误”,这里的“其他位置”指的是在匹配失败的分支里或者整个if-else外部使用这个变量的情况,比如你如果在第一个分支外面写Console.WriteLine(ac.ObjectId),编译器会报错,因为ac只有在匹配成功的分支里才是有效赋值的。但这并不意味着变量的声明作用域只限于匹配成功的分支,变量的声明还是绑定到整个if-else块的,所以不能重复声明同名变量。
所以解决方法很简单,给第二个分支的模式匹配变量换个名字就行,甚至可以改成更有语义的名字(比单纯的ac2可读性更好),修改后的代码如下:
if (action is ActionRegisterNewDevice ac) { state = state.ShallowCopy(); // Initialise the device to off state.DeviceOn[ac.ObjectId] = false; } else if (action is ActionOnMouseDown mouseDownAc) { state = state.ShallowCopy(); // toggle the state of the device state.DeviceOn[mouseDownAc.ObjectId] = !DeviceSelectors.Device_is_on(state, mouseDownAc.ObjectId); }
这样既符合C#的作用域规则,代码可读性也更好。
内容的提问来源于stack exchange,提问作者AJP
相关产品推荐
相关产品推荐

