[译]委托和接口泛型参数类型的协变和逆变

任何一个委托的泛型参数类型能够被标记为协变或者逆变。泛型的参数类型只能是以下的一种:

不变的

逆变的, 用In标记,只能用在输入参数上,表示该参数接受子类

协变的, 用Out标记,只能用在输出参数上,表示该参数返回接受父类

示例:

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

   Func<Object, ArgumentException> fn1 = null;

   Func<String, Exception> fn2 = fn1; // No explicit cast is required here

   Exception e = fn2("")

由于in 和 out的标记作用,该代码在编译时就是类型安全的。

当使用有泛型参数的委托的时候,我们强烈建议总是指定in和out关键字使得可以进行协变和逆变。因为这样做没有任何坏处并能够使你的委托能够在更大的范围内使用。

和委托一样,泛型参数接口也能够协变和逆变。

 public interface IEnumerator<out T> : IEnumerator {

    Boolean MoveNext();

    T Current { get; }

    }

    Int32 Count(IEnumerable<Object> collection) { ... }

    Int32 c = Count(new[] { "Grant" })

你可能感兴趣的:(接口)