2016-02-18 40 views
5

z wypowiedzi członków mocny C# 6, można napisać:W jaki sposób członkowie ciała wyrażeń odróżniają puste i nieważne?

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

I mogę napisać:

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

W pierwszym przypadku, wyrażenie zwraca coś. W drugim nie.

Co się tutaj dzieje, aby ustalić, jak "działać" bez potrzeby stosowania dodatkowej składni? A może jest to po prostu przypadek, gdy patrzy na sygnaturę metody podczas kompilacji?

Nie jestem wielkim fanem pozostawiania rzeczy "po prostu pracuję" bez wiedzy o tym, co się dzieje.

+1

Myślę, że '$" ... "' to po prostu krótka wersja 'String.Format (...)', która niewątpliwie zwraca 'ciąg'. – HimBromBeere

+1

Jest to kolejna funkcja C# 6 nazywana interpolacją ciągów. Może zmąciłem wody, używając tego jako fragmentu testowego. Moje pytanie dotyczy raczej tego, w jaki sposób składnia wyrażeń decyduje o tym, co zwrócić i kiedy. –

+0

W twoim drugim przykładzie typem zwrotnym jest 'void', nieprawdaż? Nie ma już dalszej decyzji kompilatora. Nie widzę twojego problemu. – HimBromBeere

Odpowiedz

3

Po pierwsze, FullName to nieruchomość. To zawsze zwraca wartość. W związku z tym sygnatura jednostki powinna być Func<T>, gdzie T jest typem zwrotnym (który jest zdefiniowany jako string w twojej próbce) lub odpowiednikiem uczestnika.

Podpis metody: void Print(string message) to Action<string>, ponieważ kompilator rozumie, że pustka nie zwraca wartości i przyjmuje pojedynczy parametr. Rozumie, że niektóre instrukcje zwracają wartość (np. => "a"), a niektóre z nich mogą działać samodzielnie (chociaż mogą zwrócić wartość taką jak => new object()). W związku z tym może powiedzieć, jeśli zepsuć: "CS0201: Tylko przypisania, wywołanie, inkrementacja, dekrementacja i nowe wyrażenia obiektów mogą być używane jako instrukcja".