web-dev-qa-db-fra.com

Pourquoi le compilateur C # autorise-t-il une variable dupliquée dans une portée imbriquée?

Historiquement, lors du développement en .Net, je ne pouvait pas dupliquer le nom de la variable dans la portée imbriquée. Cependant, après avoir récemment mis à jour Visual Studio 2019 vers la version 16.4.2, j'ai remarqué que les noms de variables peuvent être dupliqués dans une portée imbriquée.

Par exemple:

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

Pourquoi est-ce soudainement autorisé?

Question de suivi: S'il s'agit d'une nouvelle "fonctionnalité" de langage, existe-t-il un moyen de configurer Visual Studio pour qu'il continue à s'arrêter lorsqu'une variable est dupliquée dans portée imbriquée?

18
masterjeef

Il s'agit d'une nouvelle fonctionnalité de C # 8.0, les fonctions locales et les paramètres lambda peuvent masquer les noms externes.

1
Sebastian 506563

je suppose que la fonction de sélection est compilée en tant que statique car elle n'a aucune connexion avec le corps de la méthode hôte. il imprime et renvoie simplement l'article en question. cela ne nécessite aucun accès à la méthode et en tant que tel, il peut, pour des raisons d'optimisation, être déplacé hors du corps de la méthode et placé seul dans la portée globale.

et dans ce cas, cette variable de test est sa propre variable et n'a aucun lien avec la variable de test ci-dessus.

pour éviter cela, vous ne pouvez pas dire à vs de lancer une erreur quand cela se produit, il vous suffira de changer manuellement le nom de la variable.

0
Bailey Drahoss