以下代码无法编译,指出“无法在此范围内声明名为‘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 不在范围内,但不允许我定义一个与子范围内使用的变量同名的新变量(这此时显然超出范围)。
编译器是否通过拒绝让我使用变量来简单地强制范围?如果是这样的话,这是有道理的。
===========
编辑:
我想我也觉得有趣的是如何在一个方法中的两个子范围内拥有相同的变量,所以这是有效的:
{
string thisWorks= string.Empty;
}
{
string thisWorks= "Should this work?";
}
我只是有点好奇您可以有两个同名的变量,只要它们处于同一级别(如果您将作用域视为一棵树)。这是有道理的,因为您可以在同一个类的两个方法中使用相同名称的局部变量。
令我感到惊讶的是,编译器能够区分并允许这样做,但不允许使用 postParent 变量。这是技术限制还是设计决定?这就是我真正想要达到的目的;-)
最佳答案
是的,编译器正在强制作用域。请注意,变量的范围是它所属的词法 block - 不仅仅是从声明点开始,而是整个范围。
编译器提示是因为对 postParent 的赋值超出了它的范围(这只是嵌套的大括号)。如果您尝试在当前分配给 postParent 的位置声明一个新变量,问题将出在嵌套 block 上,因为 postParent 的范围将包括嵌套 block ,即使它在声明之前。
范围在 C# 3.0 规范的第 3.7 节中进行了描述。
编辑:回复您的问题编辑。
这只是两个简单的规则:
我确信语言可以设计成作用域只从声明点开始,但我认为将作用域视为 block 更简单(就语言复杂性而言)——所以所有局部变量都声明在例如,同一 block 具有相同的范围。在考虑捕获变量时,这也让生活变得更加简单 - 因为捕获的内容取决于范围,而嵌套范围使生活变得有趣......
编辑:语言规范对原始的 lambda 表达式示例有这样的说明 - 这是第 7.14.1 节:
The optional anonymous-function-signature of an anonymous function defines the names and optionally the types of the formal parameters for the anonymous function. The scope of the parameters of the anonymous function is the anonymous-function-body. Together with the parameter list (if given), the anonymous-method-body constitutes a declaration space. For this reason, it is a compile-time error for the name of a parameter of the anonymous function to match the name of a local variable, local constant, or parameter whose scope includes the anonymous-method-expression or lambda-expression.
这有帮助吗?
关于c# - 子范围 & CS0136,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/296755/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳