c# - 使用“is”关键字时已定义局部变量 - 与语言参考不符
问题描述
expr is type varname
如果 expr
true
与语句is
一起使用if
,则分配 varname 并且仅在语句内具有局部范围if
。
if(first_object is Folder folder)
{
// ...
}
if(second_object is Folder folder) // ERROR!
{
// ...
}
以上产生以下错误:
在这个范围内已经定义了一个名为“文件夹”的局部变量或函数
为什么我不能重用变量名,因为它应该只对每个if
语句都是本地的?
解决方案
根据文档:
public static double ComputeAreaModernIs(object shape)
{
if (shape is Square s)
return s.Side * s.Side;
else if (shape is Circle c)
return c.Radius * c.Radius * Math.PI;
else if (shape is Rectangle r)
return r.Height * r.Length;
// elided
throw new ArgumentException(
message: "shape is not a recognized shape",
paramName: nameof(shape));
}
让我们从范围开始详细检查这两个规则。变量 c 仅在第一个 if 语句的 else 分支的范围内。变量 s 在方法 ComputeAreaModernIs 的范围内。这是因为 if 语句的每个分支都为变量建立了一个单独的范围。但是,if 语句本身没有。这意味着在 if 语句中声明的变量 与 if 语句(本例中的方法)在同一范围内。这种行为不是特定于模式匹配的,而是为变量范围以及 if 和 else 语句定义的行为。
是不是很奇怪,而且令人困惑(这if
并没有设置范围,但else
确实如此)?是的,是的。:)
推荐阅读
- android - Android vs iOS:在 Android 上为非首选项屏幕创建类似首选项的布局
- sql - 映射两个数字列
- python - 将列表的每个元素与另一个列表的相应元素进行比较的最快方法是什么?
- pandas - 将 Groupby 应用于作为过滤器结果的结果空数据帧
- arduino - 使用串口将具有多个变量的字符串传递给anrduino
- sockets - 如何在 C 中显式设置 UDP 通信中的客户端源端口?
- ios - 是否可以在 xcode iOS Swift 中使用 MapBox 创建 AR 室内导航?
- mongodb - 如何使用通过rest webservice(org.springframework.data.mongodb.core.MongoOperations)插入的Grails应用程序更新记录?
- java - 安卓设备和基于 Linux 的硬件之间的数据传输
- c# - 尝试为 DiscordSocketClient 及其属性创建模拟对象