我只需要再次使用协变 out
泛型类型修饰符。我有一个具有通用类型的类,想添加一个 out
但 VS 告诉我这只能在接口(interface)上实现。
但为什么只能在接口(interface)上使用 out
修饰符呢?
我帮助自己创建了我的类的接口(interface)副本,但我觉得只有一个接口(interface)才能使用这个修饰符,这对我来说有点奇怪。
最佳答案
要确保类的定义实际上是协变的是极其困难的。编译器更容易确保接口(interface)实际上是协变的。
对于一个类,只需拥有一个使用泛型类型的字段即可立即强制泛型参数不变,因为就编译器而言,该值既可以读取也可以修改。虽然类可能支持变体,但在实践中,开发人员实际使用它需要申请的约束将非常困难,这比简单地创建一个包装接口(interface)要困难得多。
让我们考虑一个简单的例子:
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
不是协变的(直到您将其转换为接口(interface))。它接受类型为 T
的输入值(通过构造函数)。接口(interface)之所以能够协变,只是因为构造函数没有通过接口(interface)暴露出来。
关于c# - 为什么我需要协方差接口(interface)(输出类型)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23480144/