實施例:λ可變範圍
myObject.Stub(s => s.MyMethod(null)).IgnoreArguments().Return("bleh");
var s = "s";
甲變量「s」中的λ和另一變量「s」爲局部變量相同的方法中被定義。當我將鼠標懸停在第一個「s」上時,Visual Studio告訴我「下面定義了一個衝突的變量」。爲什麼這些衝突; lambda中的「s」在其封閉括號之外是不可用的?
實施例:λ可變範圍
myObject.Stub(s => s.MyMethod(null)).IgnoreArguments().Return("bleh");
var s = "s";
甲變量「s」中的λ和另一變量「s」爲局部變量相同的方法中被定義。當我將鼠標懸停在第一個「s」上時,Visual Studio告訴我「下面定義了一個衝突的變量」。爲什麼這些衝突; lambda中的「s」在其封閉括號之外是不可用的?
它們是衝突的,因爲C#的規則是任何兩個用途相同的簡單名稱不能用於在立即包圍其中任何一個的塊內引用兩個不同的東西。在你的例子中,簡單的名字「s」用於表示封閉局部變量聲明的塊內的兩件事:它表示一個局部變量和一個lambda參數。 那是什麼是非法的。我注意到,您收到錯誤消息告訴你:
A local variable named 's' cannot be declared in this scope because it would give a different meaning to 's', which is already used in a 'child' scope to denote something else
C#不允許你有相同的簡單名稱的意思是在同一塊兩件事情,因爲這樣做使得代碼很容易出錯,很難編輯,硬閱讀,難以重構和難以調試。禁止這種不好的編程實踐比允許它並且冒你造成錯誤更好,因爲你認爲「s」在整個塊中意味着相同的東西。
當代碼長度只有兩行時,很容易記住s有兩個不同的含義,但是當它長達數百行時,並不那麼容易。
有關此規則的詳細信息,請參閱:
http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are-not-so-simple.aspx
嗯,我想起你的貼子。謝謝你糾正我。 – 2010-06-28 18:09:14
參見:http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are -not-so-simple.aspx – 2010-06-28 15:45:27