本question我開始想,爲什麼下面的例子都屬於違法行爲在C#中的啓發:爲什麼是的,如果和代表這種方式在C#範圍
VoidFunction t = delegate { int i = 0; };
int i = 1;
和
{
int i = 0;
}
int i = 1;
我只是想知道是否有人知道這種語言是如此設計的確切原因?是否會阻礙糟糕的編程習慣,如果是這樣,爲什麼不發出警告呢?出於性能原因(編譯和運行時)或原因是什麼?
本question我開始想,爲什麼下面的例子都屬於違法行爲在C#中的啓發:爲什麼是的,如果和代表這種方式在C#範圍
VoidFunction t = delegate { int i = 0; };
int i = 1;
和
{
int i = 0;
}
int i = 1;
我只是想知道是否有人知道這種語言是如此設計的確切原因?是否會阻礙糟糕的編程習慣,如果是這樣,爲什麼不發出警告呢?出於性能原因(編譯和運行時)或原因是什麼?
此行爲在C#語言規範的第3節中介紹。下面是從規範報價
同樣, 發生如在 λ-表達形式的匿名 函數體的任何表達式創建包含匿名的 參數 聲明空間功能。 這是一個錯誤, 局部變量聲明空間的兩個成員到 具有相同的名稱。 塊的局部變量聲明空間 和嵌套局部變量 聲明空間包含具有相同名稱的元素 的錯誤。因此,在 嵌套聲明空間內,不是 可能聲明局部變量 或常量,其名稱與 局部變量或常量聲明空間中的 相同。
我認爲更容易閱讀的方法是,爲了變量聲明(和許多其他塊相關函數)的目的,lambda /匿名委託塊被視爲與正常塊沒有區別。至於爲什麼這種語言是這樣設計的,規範沒有明確規定。我的意見雖然簡單。如果代碼被視爲另一個塊,那麼它使代碼分析例程變得更容易。您可以保留現有的所有例程,以分析塊的語義錯誤和名稱解析。當您考慮可變提升時,這一點尤爲重要。 Lambdas最終將會是一個不同的功能,但他們仍然可以在聲明點訪問所有範圍變量。
我認爲這樣做是爲了讓內部作用域可以訪問在外部作用域中聲明的變量。如果允許您重寫外部範圍中存在的變量,則可能會出現混淆意圖的行爲。所以他們可能決定通過阻止問題的發生來解決問題。
我認爲這樣可以防止開發者在腳下自己拍攝。
看來,問題在於他們沒有區分刪除前後的範圍。這可能會使編譯器供應商的代碼變得相當簡單,但是會增加程序員的負擔。 – 2009-01-01 17:53:09
@安德斯,是的,但在這種情況下,有一個工作。運輸是一個持續不斷的壓力,當面臨在大型工作項目之間進行選擇以獲得一小部分功能或小項目(這使得功能缺乏明確並且可以稍後逆轉)時,小型工作項目通常會獲勝。 – JaredPar 2009-01-01 18:04:48
我不明白這可能會如何很難實現,至少不是如果情況。只需使用一個堆棧並完成它。它聞到了很多臭蟲或測量的痕跡,以防止人們在腳上拍攝自己的腳,這些腳採用了一些不錯的功能。 – 2009-01-01 19:16:24