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

标签 c# generics covariance

我只需要再次使用协变 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/

相关文章:

Java 泛型方法不起作用 - 参数不受限制

java - RecyclerView 适配器的 Kotlin 泛型

swift - 具有继承错误的泛型

matlab - Matlab 中的多元随机数生成

c# - 为什么我的 Grid Tapped 事件没有被调用?

c# - 处理 .NET 应用程序许可的最简单方法是什么?

c# - 是否可以通过单击按钮事件导航到枢轴控制页面

java - 遵循 Venkat Subramaniam 的书,使用 lambda 表达式来玩策略设计模式?

python - Numpy Cholesky 分解 LinAlgError

C#生成一个随机的Md5 Hash