簡體   English   中英

為什么 C# 編譯器允許嵌套范圍內的重復變量?

[英]Why does the C# compiler allow a duplicated variable in nested scope?

從歷史上看,在 .Net 中開發時,我無法在嵌套范圍內復制變量的名稱。 但是,在最近將 Visual Studio 2019 更新到版本 16.4.2 后,我注意到變量名可以在嵌套范圍內重復。

例如:

var test = "hello";
Console.WriteLine(test);
var things = new []{"one", "two", "three"};
things.Select(test => // <- test is duplicated here, normally this breaks compilation
{
    Console.WriteLine(test);
    return test;
}).ToList();

// output:
// hello
// one
// two
// three

https://dotnetfiddle.net/h85BK4

為什么突然允許這樣做?

后續問題:如果這是一個新的語言“功能”,是否有辦法將 Visual Studio 配置為在嵌套范圍內重復變量時繼續中斷?

這是 C# 8.0 中的一項新功能,本地函數和 lambda 參數可以隱藏外部名稱。

我的猜測是 select 函數被編譯為靜態,因為它沒有連接到主機方法體。 它只是打印並返回有問題的項目。 這不需要對方法的任何訪問,因此,出於優化原因,它可以移出方法主體並在全局范圍內單獨放置。

在這種情況下,該測試變量是它自己的變量,與上述測試變量沒有任何聯系。

至於防止這種情況,您不能告訴 vs 在發生錯誤時拋出錯誤,您只需手動更改變量名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM