2015-11-08 21 views
19

byłem bawić z moim projekcie C# trochę i byłem zaskoczony, aby zobaczyć ten kod kompiluje:Dlaczego poniższy kod jest kompilowany bez błędów?

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

odwrócenie na odwrót, jak Action<string> a = ref b => b = "hello"; da syntaktyczną błąd w „ref”.

Rzeczywiście, kopiowania wklejenie fragmentu kodu do http://dotnetfiddle.net daje błąd kompilatora:

A ref or out argument must be an assignable variable 

ja napotkał błąd w kompilator? (Używam VS 2015 i C# 6)


EDIT: Wystarczy włączyć do kompilatora Roslyn na .NET Fiddle, to nadal emituje ten sam błąd.

+2

Próbowałem go na [tryroslyn] (http://goo.gl/00ZyS0) i tak: kompiluje - zachowanie jest takie samo, jak gdyby 'ref' nie było. Wygląda jak błąd (który powinien zostać zgłoszony, jeśli jeszcze nie został zrobiony). –

+2

@LucasTrzesniewski Rzeczywiście. Przesłałem problem do [Roslyn GitHub repo] (https://github.com/dotnet/roslyn/issues/6646) na ten temat. –

+0

Dziwne. A co z poprawnym składniowo lambda '(ref string b) => b =" hello "' (zauważ nawias i typ 'string'), czy można go przekonwertować na' Action 'z tym kompilatorem? Nie mam teraz dostępu do kompilatora Visual C# 6. –

Odpowiedz

6

To brzmi jak błąd kompilatora w VS2015. To jest złożony jak https://github.com/dotnet/roslyn/issues/6646

+1

Nie, mam na myśli kompilator produktu o nazwie "Visual Studio 2015". –

+0

* "Jest to umyślny błąd, który utrzymujemy, aby nie złamać istniejącego kodu." *. Powiedz co? : - \ –

0

myślę w pierwszym Action

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

ref jest odniesienie do pełnego działania b=>b = "hello"

natomiast w drugi

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

ref jest odniesienie do b w odnośniku b => b = "cześć"

Sprawdź poniżej fiddle

+2

Nie ma przeciążenia konstruktora 'Action', który bierze argument o wartości ref, więc nadal powinien to być błąd w pierwszym przypadku. –