2016-02-18 16 views
5

Với các thành viên biểu hiện thân C# 6, tôi có thể viết:Làm cách nào để các thành viên biểu hiện phân biệt giữa khoảng trống và không có giá trị?

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

Và tôi có thể viết:

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

Trong trường hợp đầu tiên, biểu thức trả về một cái gì đó. Trong lần thứ hai, nó không.

Điều gì đang xảy ra ở đây để xác định cách 'hành động' mà không cần thêm bất kỳ cú pháp nào? Hay đơn giản là một trường hợp nhìn vào chữ ký phương thức trong thời gian biên dịch?

Tôi không phải là một fan hâm mộ lớn của việc để lại những thứ để 'chỉ làm việc' mà không biết những gì đang xảy ra.

+1

Tôi nghĩ rằng '$" ... "' chỉ là một phiên bản ngắn của 'String.Format (...)' mà không trả về một chuỗi '. – HimBromBeere

+1

Đó là một tính năng khác của C# 6 được gọi là nội suy chuỗi. Có lẽ tôi đã lúng túng vùng biển bằng cách sử dụng nó như một đoạn thử nghiệm. Câu hỏi của tôi là nhiều hơn về cách cú pháp biểu thức quyết định những gì cần trả lại và khi nào. –

+0

Trong ví dụ thứ hai của bạn kiểu trả về là 'void', phải không? Không có thêm trình biên dịch-quyết định về điều này. Tôi không thấy vấn đề của bạn. – HimBromBeere

Trả lời

3

Đầu tiên, FullName là tài sản. Nó luôn luôn trả về một giá trị. Do đó, chữ ký của nội dung phải là Func<T>, trong đó T là loại trả về (được xác định là string trong mẫu của bạn) hoặc đại biểu tương đương.

Chữ ký của phương thức void Print(string message)Action<string>, vì trình biên dịch hiểu rằng khoảng trống không trả về giá trị và nhận một tham số. Nó hiểu một số câu trả về một giá trị (như => "a") và một số có thể tự đứng lên (mặc dù chúng có thể trả về một giá trị như => new object()). Do đó nó có thể cho bạn biết nếu bạn mess up: "CS0201: Chỉ có thể sử dụng chỉ định, gọi, tăng, giảm và biểu thức đối tượng mới dưới dạng tuyên bố".

Các vấn đề liên quan