2010-06-28 5 views
7

Esempio:Lambda portata variabile

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

var s = "s"; 

Una variabile "s" è definita in un lambda e un'altra variabile "s" come variabile locale all'interno dello stesso metodo. Visual Studio mi dice "Una variabile in conflitto è definita sotto" quando passo il mouse sulle prime "s". Perché questi sono in conflitto? la "s" nella lambda non è disponibile al di fuori delle sue parentesi graffe sicuramente?

+0

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

risposta

8

Sono in conflitto perché una regola di C# è che non è possibile utilizzare due soli nomi uguali per riferirsi a due cose diverse all'interno del blocco che racchiude immediatamente uno di essi. Nell'esempio il nome semplice "s" è usato per indicare due cose all'interno del blocco che racchiude la dichiarazione della variabile locale: indica una variabile locale e un parametro lambda. Che quello che è illegale è. Prendo atto che il messaggio di errore che si ottiene vi dice questo:

 
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# non permette di avere lo stesso nome semplice significa due cose nello stesso blocco, perché così facendo rende il codice di errore incline, difficile da modificare, duro leggere, difficile da refactoring e difficile da eseguire il debug. È meglio disabilitare questa cattiva pratica di programmazione piuttosto che permetterlo e rischiare di causare bug perché si presuppone che "s" significhi la stessa cosa in tutto il blocco.

Quando il codice è lungo solo due righe, è facile ricordare che ci sono due significati diversi per s, ma quando è lungo centinaia di righe, non è così facile.

Per ulteriori informazioni su questa regola, vedi:

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

+0

hmm, mi sono ricordato qualcosa del tuo post. Grazie per avermi corretto. –