为什么我需要协方差接口(输出类型)?

时间:2014-05-05 19:22:16

标签: c# generics covariance

我只需要再次使用协变out泛型类型修饰符。我有一个泛型类,想要添加out,但VS告诉我这只能在接口上使用。

但为什么我只能在界面上使用out修饰符?

我帮助自己创建了我的类的接口副本,但这对我来说似乎有点奇怪,因为我只能使用这个修饰符。

1 个答案:

答案 0 :(得分:7)

确保类的定义实际上是协变的是非常困难的。编译器更容易确保接口实际上是协变的。

使用类,只需使用泛型类型的字段立即强制泛型参数不变,因为就编译器而言,可以读取和修改该值。尽管类可能可能以支持方差,但实际上,开发人员实际使用它所需要的约束将非常困难,而不仅仅是创建一个包装接口。 / p>

让我们考虑一个简单的例子:

public interface IWrapper<out T>
{
    T Value { get; }
}
public class Wrapper<T> : IWrapper<T>
{
    public Wrapper(T value)
    {
        Value = value;
    }
    public T Value { get; private set; }
}

上面显示的类与T 不一致(直到您将其转换为界面)。它接受类型为T的输入值(通过构造函数)。该接口只能是协变的,因为构造函数不是通过接口公开的。