C#コンパイラはネストされたスコープで重複した変数を許可するのはなぜですか?


18

歴史的に、.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が引き続きブレークするように構成する方法はありますか?


2
変数の重複を許可しているとは思いません。testデータ型が同じなので、同じ変数を使用します。 たとえば、test変数を宣言してみてくださいintvar test = 12345;コンパイルエラーになると思います。(私は試していません)
LP13

1
@ LP13 test提案されたようにタイプを変更しても効果はありません。質問にリンクされているフィドルで試すことができます。
エイミー

1
ターゲットのフレームワークは無関係です。新しい動作は言語バージョンによるものです。C#8、それはC#7.3でコンパイルできない(と私は仮定の下)上のコードのコンパイル
エマニュエルVintilă


6
そのためのGitHubの問題があります。マイルストーンは16.5に設定されています。@OrkhanAlikhanovあなたはそれをより早く見つけました:)
Pavel Anikhouski

回答:



0

私の推測では、selectメソッドは、ホストメソッド本体への接続がないため、静的としてコンパイルされています。問題のアイテムを印刷して返すだけです。これはメソッドへのアクセスを必要としないため、最適化の理由でメソッド本体から移動し、グローバルスコープ内で独自に配置できます。

この場合、そのテスト変数はそれ自体の変数であり、上記のテスト変数との接続はありません。

これを防ぐには、発生したときにエラーをスローするようにvsに指示することはできません。手動で変数名を変更するだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.