我只需要再次使用协变out
泛型类型修饰符。我有一个泛型类,想要添加out
,但VS告诉我这只能在接口上使用。
但为什么我只能在界面上使用out
修饰符?
我帮助自己创建了我的类的接口副本,但这对我来说似乎有点奇怪,因为我只能使用这个修饰符。
答案 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
的输入值(通过构造函数)。该接口只能是协变的,因为构造函数不是通过接口公开的。