Gia đình Func
của các đại biểu (hoặc Action
cho rằng vấn đề) là gì, nhưng loại đại biểu đơn giản tuyên bố như
//.NET 4 and above
public delegate TResult Func<out TResult>()
public delegate TResult Func<in T, out TResult>(T obj)
//.NET 3.5
public delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2)
public delegate TResult Func<T1, T2, T3, TResult>(T1 obj1, T2 obj2, T3 obj3)
, vv Các đại biểu như vậy có thể có tham số out/ref, do đó, trong trường hợp của bạn, nó chỉ là vấn đề thực hiện tùy chỉnh của chính bạn như các câu trả lời khác đã chỉ ra. Về lý do tại sao Microsoft không đóng gói này theo mặc định, hãy nghĩ đến số lượng kết hợp tuyệt đối mà nó sẽ yêu cầu.
delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2)
delegate TResult Func<T1, T2, TResult>(out T1 obj1, T2 obj2)
delegate TResult Func<T1, T2, TResult>(T1 obj1, out T2 obj2)
delegate TResult Func<T1, T2, TResult>(out T1 obj1, out T2 obj2)
chỉ với hai tham số. Chúng tôi thậm chí không chạm vào ref
. Nó thực sự sẽ rườm rà và gây nhầm lẫn cho các nhà phát triển.
Trong trường hợp người khác bị nhầm lẫn như tôi, bạn không * có * để gọi đại biểu của bạn "Func" như người được cài sẵn ... – Dunc
@Dunc - Đã sửa lỗi. Tôi đã thực sự bối rối vì nó không phải là bình luận của bạn. –
Trong C# 4 (2010) và sau đó (không được phát hành khi bạn viết câu trả lời của bạn) có thể đánh dấu 'T' là contravariant và' V' là biến thể. Tuy nhiên, vì một tham số ('output') của kiểu' U' được truyền *** bởi tham chiếu ***, 'U' không thể được đánh dấu đồng hoặc contravariant và phải duy trì" bất biến ". Vì vậy, hãy xem xét "đại biểu công cộng V MyDelegate (T đầu vào, ra đầu ra U),' nếu bạn sử dụng C# 4 hoặc sau đó. –