作者AmosYang (泛用人型编码器)
看板C_Sharp
标题Re: [问题] 变数范围
时间Mon May 18 00:49:09 2015
结论: 在 C# 6.0 里,这条规则应会被移除
※ 引述《mingpepe ()》之铭言:
: 编译错误讯息:无法在此范围宣告名为 'i'的变数,因为其可能赋予 'i'不同的意义
: 为什麽呢?
用 ildasm 去看编出来的 CIL, 我觉得这限制单纯来自 C# compiler;
而非 CLR
: → mingpepe: 是的 我当然了解这是C#不是C++ 我好奇的是理由 05/17 23:42
: → mingpepe: 不同的语言有不同的语法 也会带来不同的好处与坏处 05/17 23:42
http://blogs.msdn.com/b/ericlippert/archive/2009/06/22/why-doesn-t-c-implement-top-level-methods.aspx
"I am asked "why doesn't C# implement feature X?" all the time.
The answer is always the same: because no one ever designed,
specified, implemented, tested, documented and shipped that
feature. All six of those things are necessary to make a feature
happen. All of them cost huge amounts of time, effort and money.
Features are not cheap, and we try very hard to make sure that
we are only shipping those features which give the best possible
benefits to our users given our constrained time, effort and
money budgets."
有的时候,所谓「好处、坏处」不只是语言本身,还得考量额外的因
素,例如,设计、实作、测试、维护 compiler 的成本
可说是 software business (业界) vs. software engineering (学界)
的微妙差异 :D
: → mingpepe: 既然在for回圈外无法存取变数i 有什麽样的理由会限制 05/17 23:43
: → mingpepe: 不能再次宣告同名的变数 05/17 23:44
: C#5.0 Spec 7.6.2.1 有提到
http://stackoverflow.com/questions/29750618/lambda-parameter-conflicting-with-class-field-on-accessing-field-in-later-scope
"The rule is gone for good; see Jon's answer for details."
https://github.com/dotnet/roslyn/issues/2110
"It is a deliberate change. Not quite up there to advertise as
a feature, we have nevertheless gotten rid of the "invariant
meaning" rule that used to cause your example to error.
The rule was well intended, in that it was supposed to minimize
the risk of "moving code around" in a way that would silently
change its meaning. However, everyone we talked to only seemed
to know about the rule from when it was causing them unnecessary
grief - no-one had ever been saved by its prohibitions.
Furthermore, the extra tracking necessary in the compiler to
enforce the rule interactively was causing significant complications
to the code, as well as non-trivial performance overhead. Now,
if it were a good rule we would have kept it anyway, but it isn't!
So it's gone."
如开头结论所述,这条规则会在 C# 6.0 被移除
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 68.4.115.53
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1431881354.A.7F8.html
※ 编辑: AmosYang (68.4.115.53), 05/18/2015 00:50:18
1F:推 mingpepe: 感谢回答 05/18 02:46
2F:→ mingpepe: 虽然这规则将会被移除 但上一篇最下面从Spec中的例子 05/18 02:57
3F:→ mingpepe: 还是不太了解这个命名规则 05/18 02:58
可参考该 stackoverflow 连结;发问者有整理他的理解,底下
C# 大神 Eric Lippert
有更进一步解释,以及他的 blog 专文
4F:→ GoalBased: 是说A大也写C#吗XD 05/18 09:16
是的
※ 编辑: AmosYang (68.4.115.53), 05/18/2015 12:36:06