2010-06-28 7 views
7

Exemple:Lambda portée des variables

myObject.Stub(s => s.MyMethod(null)).IgnoreArguments().Return("bleh"); 

var s = "s"; 

Une variable "s" est définie dans un "s" lambda et une autre variable en tant que variable locale à l'intérieur de la même méthode. Visual Studio me dit "Une variable conflictuelle est définie ci-dessous" lorsque je survole le premier "s". Pourquoi sont-ils contradictoires? le "s" dans le lambda n'est pas disponible en dehors de ses supports enfermés sûrement?

+0

Voir: http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are -not-so-simple.aspx –

Répondre

8

Ils sont en conflit car une règle de C# est que deux utilisations du même nom simple ne peuvent pas être utilisées pour faire référence à deux choses différentes à l'intérieur du bloc englobant immédiatement l'un d'entre eux. Dans votre exemple, le nom simple "s" est utilisé pour signifier deux choses à l'intérieur du bloc entourant la déclaration de variable locale: cela signifie une variable locale, et un paramètre lambda. Que est ce qui est illégal. Je note que le message d'erreur que vous obtenez vous dit ceci:

 
A local variable named 's' cannot be declared in this scope because it 
would give a different meaning to 's', which is already used in a 
'child' scope to denote something else 

C# ne vous permet pas d'avoir le même nom simple signifie deux choses dans le même bloc car cela fait une erreur de code ventral, difficile à modifier, dur lire, difficile à refactoriser, et difficile à déboguer. Il est préférable d'interdire cette mauvaise pratique de programmation plutôt que de l'autoriser et de risquer de causer des bogues parce que vous avez supposé que "s" signifie la même chose dans tout le bloc.

Lorsque le code n'est que de deux lignes, il est facile de se souvenir qu'il y a deux significations différentes pour s, mais quand il s'agit de centaines de lignes, ce n'est pas si simple.

Pour plus d'informations sur cette règle, voir:

http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are-not-so-simple.aspx

+0

hmm, je me suis souvenu de quelque chose à propos de votre publication. Merci de me corriger. –

Questions connexes