儿童范围 & CS0136

2024-02-19

以下代码无法编译,并指出“无法在此作用域中声明名为“st”的局部变量,因为它会给“st”赋予不同的含义,而“st”已在“子”作用域中用于表示其他内容”:

        var l = new List<string>();
        l.Find(st => st.EndsWith("12"));
        string st = "why this fails?";

我明白为什么这行不通:

        string preParent = "";
        {
            string preParent = "Should fail cause we change the meaning";
        }

当我们执行以下操作时,我们得到“CS0103:名称‘postParent’在当前上下文中不存在”:

        {
            string postParent=string.Empty;
        }
        postParent = "Should this work?";

我不明白的是,为什么编译器足够聪明,可以看到 postParent 不在作用域内,但不允许我定义一个与子作用域内使用的变量同名的新变量(这显然超出了范围)此时的范围)。

编译器是否通过拒绝让我使用变量来简单地强制作用域?如果是这样,这就有道理了。

===========

Edited:

我想我还觉得有趣的是如何在一个方法的两个子作用域中拥有相同的变量,所以这是有效的:

        {
            string thisWorks= string.Empty;
        }
        {
            string thisWorks= "Should this work?";
        }

我只是有点好奇你可以有两个同名的变量,只要它们位于同一级别(如果你将作用域视为一棵树)。这是有道理的,因为您可以在同一类的两个具有相同名称的方法中使用局部变量。

我只是感到惊讶的是,编译器能够区分并允许这种情况,但它不允许 postParent 变量。这是技术限制还是设计决定?这就是我真正想要达到的目的;-)


是的,编译器正在强制执行范围。请注意,变量的范围是它所属的词法块 - 不仅仅是从声明点开始,而是整个范围。

编译器抱怨是因为分配给postParent超出了它的范围(只是嵌套的大括号)。如果您尝试在当前分配的位置声明一个新变量postParent问题出在嵌套块上,因为postParent将包含该嵌套块,即使它位于声明之前。

C# 3.0 规范的第 3.7 节描述了范围。

编辑:回答您的问题编辑。

这只是两个简单的规则:

  • 当另一个同名局部变量在作用域内时,您无法声明局部变量
  • 局部变量的作用域是声明所在的块

我确信该语言可以被设计为作用域仅在声明点开始,但我认为将作用域视为只是块更简单(就语言复杂性而言) - 因此所有局部变量都在同一个块中声明例如,具有相同的范围。在考虑捕获的变量时,这也使生活变得更加简单 - 因为捕获的内容取决于作用域,而嵌套作用域使生活变得有趣......

编辑:语言规范对原始 lambda 表达式示例有这样的说法 - 第 7.14.1 节:

可选的 匿名函数签名 匿名函数定义名称 以及可选的正式类型 匿名函数的参数。 参数范围 匿名函数是 匿名函数体。和...一起 参数列表(如果给定), 匿名方法体构成 声明空间。为此,它 是名称的编译时错误 匿名参数的 匹配本地名称的函数 变量、局部常量或参数 其范围包括 匿名方法表达式或 lambda 表达式。

这有帮助吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

儿童范围 & CS0136 的相关文章

  • 用 C++ 进行服装建模 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在编写一些软件 最终会绘制一个人体框架 可以配置各种参数 并且计划是在假人身上放置某种衣服 我研究
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • 如何在opencv中使某些像素透明?

    我用 for 语句检查了每个像素的亮度 并尝试在亮度超过 100 时使其透明 但隐形是行不通的 看代码 image al x y 的第四个是alpha 我应该怎么办 如果你使用 bgr 的值而不是透明度 它就会改变 image cv2 im
  • symfony2 - Doctrine - 如何使用计数和分组进行多重选择

    在 Symfony2 和 Doctrine 中 我想执行一个返回计数和分组依据的查询 这是我尝试过的 这是我要运行的 SQL SELECT terrain id COUNT FROM Partie WHERE 1 1 GROUP BY te
  • 扩展/插件通信的架构

    一旦解决了加载插件的问题 在 NET 中 在例外情况下通过 MEF 下一步要解决的是与它们的通信 简单的方法是实现一个接口并使用插件实现 但有时插件只需要扩展应用程序的工作方式 并且可能有很多扩展点 我的问题是关于如何处理这些扩展点 我已经
  • 多态调用的成本 - C++

    我正在用 C 编写一个游戏 其中有大约 30 个不同的角色 每个角色都略有不同 我有一个主类 User 其中包含所有角色所需的所有数据 我的第一个实现涉及仅枚举 30 个角色并进行适当的处 理 但现在我想知道将 User 作为基类并且每个角
  • 谷歌搜索引擎优化和隐藏元素

    谷歌会忽略CSS中设置为 display none 的元素内的单词吗 Example div style display none About Us Contact Us div 我想隐藏这样的菜单看起来可能有点奇怪 但是有一个子菜单 并将
  • PersistFieldSql 的 GeneralizedNewtypeDeriving 失败

    我正在尝试定义一个Markdown https hackage haskell org package markdown 0 1 9 docs Text Markdown html新类型 并使用GeneralizedNewtypeDeriv
  • 如何在 Laravel 5 中建立用户和角色关系

    我有两张桌子 User gt id name role id gt references id gt on roles Roles gt id role name access 我正在尝试从用户访问角色详细信息 我的用户模型有 public
  • 如何使用 Bower 进行最小安装

    我使用 Bower 来管理项目中使用的所有前端库和工具 我的bower json文件看起来像这样 name New Project version 0 1 0 dependencies jquery 1 11 1 bootstrap 3 3
  • SqlException:用户“NT AUTHORITY\NETWORK SERVICE”登录失败

    当我通过 VS 2008 运行 Web 应用程序时 该应用程序能够登录到 Sql 服务器并检查用户输入的凭据 用户名和密码 但是当我通过 IIS 7 浏览到该应用程序并尝试回发用户名和密码时 应用程序报告异常 System Data Sql
  • 在 C++ 中描述虚函数的最简洁而准确的方法是什么?

    在评估基本 C 知识的面试中 被要求描述什么是虚函数似乎是最常见的问题之一 然而 在 C 编程几年之后 我仍然有一种不舒服的感觉 即我并不真正理解如何最好地定义它们是什么 如果我查阅维基百科 我看到虚函数的定义是 在面向对象编程中 虚函数或
  • 是否可以选择属性值大于某个数字的所有元素?

    我想知道 CSS 是否可以实现以下功能 HTML 代码 span class funny elem Hello World span span class funny elem Hello Bird span span class funn
  • 系统还原后无法从 Windows 7 卸载 Python 3.4.2

    卸载 Python 3 4 2 几天后 我不得不执行系统还原 我使用的是 Windows 7 因为不小心安装了一堆垃圾软件 即使在安装后 这些垃圾软件也弄乱了我的计算机 这个系统恢复有效地 重新安装 了Python 或者更确切地说是它的损坏
  • printf 中的否定

    我有下面的代码 我不确定为什么 printf 内部的否定与外部的否定不同 char d 0x04 printf Value of d X n d d d printf Value of d X n d 打印的结果是FFFFFFFB和FB 这
  • 语法“%s”和“%d”作为调用变量的简写意味着什么?

    在此示例中 s 和 d 是什么意思 看来它是调用变量的简写 这种语法只能在类中使用吗 Class class Building Object variables properties private number of floors 5 T
  • 当您安装了 Google Analytics 时,_gl 参数对于跨域跟踪的重要性

    我有一个网站及其预订引擎 2 个不同的域 正在运行 访问者登陆该网站 然后进入预订引擎 我已正确安装 Google Analytics 分析 来衡量预订引擎域中发生的转化 一切都正确记录在 Google Analytics 帐户中 我们最近
  • 即使没有任何变化,触摸 DOM 是否会触发回流和重绘?

    我正在开发一个小型 JavaScript 模板引擎 当模型发生变化时 我有两种可能的方法来处理 DOM 的更新 在执行之前检查 DOM 更新是否确实需要 这样做的好处是不会冒不必要的更新风险 但我在跟踪旧值上浪费了空间 if oldValu
  • 发现不同版本的“System.Runtime.CompilerServices.Unsafe”之间存在无法解决的冲突

    这似乎是许多类似问题之一 但我在其他问题中找不到解决方案 我将直接跳到二进制日志 这是相应的子树ResolveAssemblyReference task There was a conflict between System Runtim
  • 使用相对路径检查文件是否存在

    使用相对路径检查文件是否存在的最佳方法是什么 我使用了以下方法 但尽管文件存在 但它返回 false bool a File Exists images Customswipe a png 那不是相对路径 你需要放弃第一个 否则它将被解释为
  • 使用子类中的 getter/setter 对覆盖 JavaScript/TypeScript 基类中的属性是否有效?

    最近 TypeScript引入了编译错误 https github com microsoft TypeScript pull 37894 当用户尝试使用 getter setter 对覆盖基类中的属性时 属性访问增强 class Base
  • 儿童范围 & CS0136

    以下代码无法编译 并指出 无法在此作用域中声明名为 st 的局部变量 因为它会给 st 赋予不同的含义 而 st 已在 子 作用域中用于表示其他内容 var l new List