2017-01-25 3 views
1

Ich habe einen C# MVC Web-App auf meiner Arbeit, und es gibt eine Zuordnung direkt innerhalb einer Controller-Klasse geerbt, die wie folgt aussieht:Warum funktioniert "=>" Zuweisung in diesem Fall, aber nicht "="?

public class FooController : Controller 
{ 
    private IAuthenticationManager AuthenticationManager => HttpContext.GetOwinContext().Authentication; 
} 

Visual Studio hebt es mit einem Fehler, so etwas wie „; erwartet ". Aber es kompiliert und läuft gut. Wenn ich das "=>" in eine einfache Zuweisung "=" ändere, markiert es HttpContext mit einem Fehler "Eine Objektreferenz ist für das nicht-statische Feld bla bla bla bla ... erforderlich" und es wird nicht kompiliert.

Also hier ist meine Frage. Warum kompiliert und funktioniert der Operator "=>" richtig? Ich bin neu in C# (kam von Android/iOS-Entwicklung), also, während es einfach genug ist, einige Dinge zu verstehen, verwirrt mich solche Dinge.

+1

Jemand wird Sie weiter erleuchten, aber das '=>' ist eine spezielle Syntax in C# 6.0 eingeführt und es ist und Ausdruck bodied Funktion. Es scheint, dass Ihre Instanz von VS und Ihre Laufzeitumgebung auf verschiedene Versionen abzielen. –

+1

Mögliches Duplikat von [Was ist die => Zuweisung in C# in einer Eigenschaftssignatur] (http://stackoverflow.com/questions/31764532/what-is- die-Zuordnung-in-c-sharp-in-a-Eigenschaft-Signatur) – Filburt

+0

Danke @ CallbackKid Ich werde das untersuchen. – whitaay

Antwort

12

=> ist keine Zuweisung. Es ist eine Abkürzung, syntaktischer Zucker in C# 6 hinzugefügt, und heißt "Expression-bodied Funktion Mitglieder".

Es ist das gleiche wie:

private IAuthenticationManager AuthenticationManager 
{ 
    get { return HttpContext.GetOwinContext().Authentication; } 
} 

Edit: Hinzufügen Kommentar von BradleyDotNET Antwort zu klären:

Genauer gesagt; es funktioniert über Zuordnung, weil es einen Methodenaufruf in einer Eigenschaft Getter zurückkehrt, nicht bei der Initialisierung eine Methode Rückgabewert einer Klasse Mitglied zuweisen versucht (was nicht erlaubt ist)

Weitere Informationen finden Sie this MSDN article .

+1

Ich liebe diesen Zusatz in C# 6, und ich benutze es die ganze Zeit. Eine Gruppe von schreibgeschützten Single-Line-Eigenschaften zu haben, sieht im Vergleich zu einem Cluster von Eigenschaften mit der Pre-6-Syntax erstaunlich aus. Ich freue mich auch auf die C# 7 Änderungen, in denen sie das Verhalten erweitern, indem sie eine Option hinzufügen, um etwas Ähnliches mit dem Setter zu machen. – Abion47

+1

Es ist nicht so viel Zucker, wenn man bedenkt, wie ähnlich es in Lambda-Ausdrücken ist. Es ist schön konsistent. –

+0

@BradleyDotNET das machte es mir viel klarer. Vielen Dank. – whitaay

Verwandte Themen