Perché il compilatore C # consente una variabile duplicata in ambito nidificato?


18

Storicamente, durante lo sviluppo in .Net non sono riuscito a duplicare il nome della variabile in ambito nidificato. Tuttavia, dopo aver recentemente aggiornato Visual Studio 2019 alla versione 16.4.2 ho notato che i nomi delle variabili possono essere duplicati in ambito nidificato.

Per esempio:

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

Perché questo è improvvisamente permesso?

Domanda di follow-up: se si tratta di una "caratteristica" di un nuovo linguaggio, esiste un modo per configurare Visual Studio per continuare a interrompere quando una variabile viene duplicata in ambito nidificato?


2
non penso che consenta una variabile duplicata. sta usando la stessa testvariabile poiché il tipo di dati è lo stesso. prova a dichiarare testvariabile come int ad es. var test = 12345;penso che dovresti ricevere un errore di compilazione. (Non l'ho provato)
LP13

1
@ LP13 La modifica del tipo di testcome suggerito non ha alcun effetto. Puoi provarlo nel violino collegato alla domanda.
Amy,

1
Non importa, il framework di destinazione è irrilevante. Il nuovo comportamento è dovuto alla versione in lingua. Il codice si compila su C # 8, non si compila su C # 7.3 (e sotto presumo)
Emanuel Vintilă


6
C'è un problema con GitHub per questo. Milestone è impostato su 16.5. @OrkhanAlikhanov l'hai trovato più velocemente :)
Pavel Anikhouski il

Risposte:


1

Questa è una nuova funzionalità di C # 8.0, la funzione locale e i parametri lambda possono oscurare i nomi esterni.


0

la mia ipotesi è che la funzione di selezione sia stata compilata come statica poiché non ha connessioni al corpo del metodo host. stampa e restituisce l'articolo in questione. ciò non richiede alcun accesso al metodo e, in quanto tale, per motivi di ottimizzazione può essere spostato dal corpo del metodo e inserito da solo nell'ambito globale.

e in questo caso, quella variabile di test è la propria variabile e non ha connessioni con la variabile di test sopra.

per evitare ciò, non puoi dire a vs di lanciare un errore quando si verifica, dovrai solo cambiare manualmente il nome della variabile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.