变体代表

代表可能有变量类型参数。

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;