Re: [問題] 變數範圍

作者: AmosYang (泛用人型編碼器)   2015-05-18 00:49:09
結論: 在 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 被移除
作者: mingpepe   2015-05-18 02:46:00
感謝回答雖然這規則將會被移除 但上一篇最下面從Spec中的例子還是不太了解這個命名規則
作者: GoalBased (Artificail Intelligence)   2015-05-18 09:16:00
是說A大也寫C#嗎XD

Links booklink

Contact Us: admin [ a t ] ucptt.com