2015-11-08 21 views
19

avrei dovuto vedermela con il mio C# progetto un po 'e sono rimasto sorpreso di vedere questo codice viene compilato:Perché il seguente codice viene compilato senza errori?

var a = new Action<string>(ref b => b = "hello"); 

capovolgendolo il contrario, come Action<string> a = ref b => b = "hello"; darà un errore sintattico a 'ref'.

Abbastanza sicuro, copia-incollare il frammento in http://dotnetfiddle.net dà un errore di compilazione:

A ref or out argument must be an assignable variable 

Avere ho incontrato un bug nel compilatore? (Sto usando VS 2015 e C# 6.)


EDIT: appena passato al compilatore Roslyn su .NET Fiddle, emette ancora lo stesso errore.

+2

ho provato a [tryroslyn] (http://goo.gl/00ZyS0) e sì: compila - il comportamento è lo stesso come se 'ref' non c'era. Sembra un bug (che dovrebbe essere segnalato se non già fatto). –

+2

@LucasTrzesniewski In effetti. Ho presentato un problema a [Roslyn GitHub repo] (https://github.com/dotnet/roslyn/issues/6646) a riguardo. –

+0

Strano. Per quanto riguarda il lambda 'sintatticamente corretto (ref string b) => b =" ciao "' (nota la parentesi e il tipo 'stringa'), può essere convertito in' Azione 'con quel compilatore? Al momento non ho accesso al compilatore Visual C# 6. –

risposta

6

Sembra un bug del compilatore in VS2015. Questo è depositato come https://github.com/dotnet/roslyn/issues/6646

+1

No, intendo nel compilatore per il prodotto denominato "Visual Studio 2015". –

+0

* "È un bug intenzionale che manteniamo in modo da non interrompere il codice esistente." *. Che cosa? : - \ –

0

Credo in primo Action

var a = new Action(ref b => b = "hello");

ref è riferimento per un'azione completa b=>b = "hello"

mentre nella seconda

Action a = ref b => b = "hello";

ref è domanda b in ref b => b = "ciao"

controllo del sotto fiddle

+2

Non c'è sovraccarico del costruttore 'Action' che prende un argomento per ref, quindi dovrebbe essere ancora un errore nel primo caso. –

Problemi correlati