Func
ครอบครัวของผู้ได้รับมอบหมาย (หรือAction
สำหรับเรื่องที่) จะไม่มีอะไร แต่ประเภทผู้รับมอบสิทธิ์ที่เรียบง่ายเช่นการประกาศ
//.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)
เป็นต้นผู้ได้รับมอบหมายอาจมีพารามิเตอร์ out / ref ดังนั้นในกรณีของคุณมันเป็นเพียงเรื่องของการใช้งานที่กำหนดเองด้วยตัวเองตามที่คำตอบอื่น ๆ ได้ชี้ให้เห็น สำหรับสาเหตุที่ Microsoft ไม่ได้แพ็คสิ่งนี้ตามค่าเริ่มต้นให้คิดถึงจำนวนชุดค่าผสมที่มันต้องการ
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)
เพียงสองพารามิเตอร์ เรายังไม่ได้แตะต้องref
เลย มันจะยุ่งยากและสับสนสำหรับผู้พัฒนา
T
ว่า contravariant และV
เป็น covariant อย่างไรก็ตามเนื่องจากพารามิเตอร์ (output
) ประเภทU
จะถูกส่งผ่านโดยการอ้างอิง ,U
ไม่สามารถทำเครื่องหมายร่วมหรือ contravariant และต้องยังคงอยู่ "คงที่" ดังนั้นควรพิจารณาpublic delegate V MyDelegate<in T, U, out V>(T input, out U output);
หากคุณใช้ C # 4 หรือใหม่กว่า