结论: 在 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 被移除