2011-11-01 34 views
7

Trong .NET 4.0, có một phương pháp đại biểu built-in:Xin giải thích về Func đại biểu trong .NET 4.0

public delegate TResult Func<in T, out TResult>(T arg); 

Nó được sử dụng trong các phương pháp extesion LINQ, ví dụ:

IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate); 

tôi không hiểu rõ về đại biểu Func, tại sao biểu thức lambda sau đây khớp với nó:

// p is a XElement object 
p=>p.Element("firstname").Value.StartsWith("Q") 

Trả lời

12

Func<T,TResult> chỉ đơn giản có nghĩa là: phương thức chấp nhận một tham số T và trả lại TResult. Lambda của bạn khớp với nó, trong đó cho T=XElementTResult=bool, lambda của bạn mất một số T và trả về một TResult. Trong trường hợp đó cụ thể trường hợp nó thường được gọi là vị từ. Trình biên dịch có thể phỏng đoán các đối số kiểu chung (TTResult) dựa trên việc sử dụng trong nhiều trường hợp (không phải tất cả).

Lưu ý inout tham khảo (đồng | Contra) hành vi -variance của phương pháp này - không phải là sử dụng bình thường của out (tức out đây không nghĩa by-ref, không giả định là được chỉ định trên cuộc gọi và cần được chỉ định trước khi thoát).

+0

Nếu bạn thay đổi từ 'phương thức' để hoạt động trong ngữ cảnh này, tôi sẽ đồng ý với câu trả lời của bạn và sẽ upvote nó. –

+3

@Lajos no, nó sẽ ** không chính xác ** để làm điều đó; C# nói riêng * không có * chức năng; một đại biểu như 'Func ' liên kết với một ** phương pháp **. –

+0

Vâng, bạn có thể tạo Mô-đun nơi bạn có thể thêm các chức năng không phải là một phần của bất kỳ lớp nào, vì vậy, C# cũng có chức năng, không chỉ các phương thức. Tôi gần như chắc chắn (nhưng không kiểm tra) rằng một hàm trong một mô-đun có thể là một biến vị ngữ. Tôi có thể sai trong phần thứ hai của bình luận này mặc dù. –

5

Func<T,TResult> ta kes hai thông số chung: TTResult. Như bạn có thể thấy, T là loại cho tham số argTResult là kiểu trả về, do đó mã của bạn

// p is a XElement object 
p=>p.Element("firstname").Value.StartsWith("Q") 

Sẽ là một giá trị Func<XElement, bool>.

Các inout các công cụ sửa đổi chung có nghĩa là các tham số là contravariant hoặc covariant.

+1

Và lừa ảo thuật, .NET sử dụng [kiểu suy luận] (http://en.wikipedia.org/wiki/Type_inference) để tìm ra loại 'T' và' TResult'. Vì vậy, nó tự động suy ra 'T' từ kiểu' p' và 'TResult' từ giá trị kết quả' StartsWith ("Q") '(boolean). –

+0

Chính xác! Như Marc đã chỉ ra, một đại biểu trả về một 'boolean' thường được gọi là một vị ngữ – Connell

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