2016-02-18 22 views
5

Mit C# 6 Ausdruck reiche Mitglieder, kann ich schreiben:Wie unterscheiden ausdrucksbasierte Mitglieder zwischen Leere und Nicht-Leere?

public string FullName => $"{_firstName} {_lastName}";

Und ich schreiben kann:

static void Print(string message) => Console.WriteLine(message);

Im ersten Fall wird der Ausdruck etwas zurückgibt. In der zweiten nicht.

Was geschieht hier, um zu bestimmen, wie man "handeln" kann, ohne dass eine zusätzliche Syntax benötigt wird? Oder ist es einfach die Methodensignatur während der Kompilierzeit zu betrachten?

Ich bin kein großer Fan von Dinge zu verlassen, nur um zu arbeiten, ohne zu wissen, was passiert.

+1

Ich denke '$" ... "' ist nur eine kurze Version von 'String.Format (...)', die ohne Zweifel eine 'string' zurückgibt. – HimBromBeere

+1

Es ist, es ist ein anderes C# 6 Feature namens String-Interpolation. Vielleicht habe ich die Gewässer verdüstert, indem ich das als Testausschnitt benutzt habe. Meine Frage ist mehr darüber, wie die Ausdruckssyntax entscheidet, was wann zurückgegeben wird. –

+0

In Ihrem zweiten Beispiel ist der Rückgabetyp "void", nicht wahr? Darüber gibt es keine weitere Compiler-Entscheidung. Ich sehe dein Problem nicht. – HimBromBeere

Antwort

3

Zunächst ist FullName eine Eigenschaft. Es immer gibt einen Wert zurück. Daher sollte die Signatur des Körpers Func<T> sein, wobei T der Rückgabetyp ist (der in Ihrer Stichprobe als string definiert ist) oder der entsprechende Delegat.

Die Signatur Ihrer Methode void Print(string message) ist Action<string>, da der Compiler versteht, dass ein void keinen Wert zurückgibt und einen einzelnen Parameter verwendet. Es versteht, dass einige Anweisungen einen Wert zurückgeben (wie => "a") und einige können eigenständig stehen (obwohl sie möglicherweise einen Wert wie => new object() zurückgeben). Daher kann es Ihnen sagen, wenn Sie versauen: "CS0201: Nur Zuweisung, Aufruf, Inkrement, Dekrement und neue Objektausdrücke können als Anweisung verwendet werden".