Re: [問題] 變數範圍

看板C_Sharp作者 (泛用人型編碼器)時間9年前 (2015/05/18 00:49), 9年前編輯推噓1(103)
留言4則, 2人參與, 最新討論串2/2 (看更多)
結論: 在 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://www.ptt.cc/bbs/C_Sharp/M.1431881354.A.7F8.html ※ 編輯: AmosYang (68.4.115.53), 05/18/2015 00:50:18

05/18 02:46, , 1F
感謝回答
05/18 02:46, 1F

05/18 02:57, , 2F
雖然這規則將會被移除 但上一篇最下面從Spec中的例子
05/18 02:57, 2F

05/18 02:58, , 3F
還是不太了解這個命名規則
05/18 02:58, 3F
可參考該 stackoverflow 連結;發問者有整理他的理解,底下 C# 大神 Eric Lippert 有更進一步解釋,以及他的 blog 專文

05/18 09:16, , 4F
是說A大也寫C#嗎XD
05/18 09:16, 4F
是的 ※ 編輯: AmosYang (68.4.115.53), 05/18/2015 12:36:06
文章代碼(AID): #1LMCQAVu (C_Sharp)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1LMCQAVu (C_Sharp)