變體代表
代表可能有變數型別引數。
delegate void Action<in T>(T t); // T is an input
delegate T Func<out T>(); // T is an output
delegate T2 Func<in T1, out T2>(); // T1 is an input, T2 is an output
這來自 Liskov 替代原則 ,該原則指出(除其他事項外)方法 D 可以被認為比方法 B 更多地派生,如果:
- D 具有與 B 相等或更多的派生返回型別
- D 具有與 B 相同或更一般的對應引數型別
因此,以下分配都是型別安全的:
Func<object, string> original = SomeMethod;
Func<object, object> d1 = original;
Func<string, string> d2 = original;
Func<string, object> d3 = original;