首页 > 解决方案 > 为什么 some_class 的通用实例不能用 some_class 子类的通用实例初始化

问题描述

以下行引发错误:

SomeGenericClass<ClassA> genericInstance = new SomeGenericClass<ClassB>();

错误说:无法将类型'SomeGenericClass<ClassB>'隐式转换为'SomeGenericClass<ClassA>'

public class SomeGenericClass<T>
{
    public T someField;
}

public class ClassA
{

}

public class ClassB : ClassA
{

}

那么,为什么它不起作用?是不是打算用 ClassA 投射它,比如何时ClassA instance = new ClassB();以及是否有任何解决方法?

标签: c#generics

解决方案


(从评论中提升。)

SomeGenericClass<T>在 中不能是协变的T

首先,泛型中的协变仅支持interfaceanddelegate类型,不支持class类型。

其次,那里有一个公共的读写类型字段T,所以在这种情况下协方差是不安全的(如果我们想象 C# 支持class类型的协方差)。

能做的,是这样的:

public interface ISomeGenericFace<out T>
{
    T SomeProperty { get; }
}

public class ClassA
{

}

public class ClassB : ClassA
{

}

注意:我使用interface而不是class. 我使用out修饰符来实现T. 我确保该成员SomeProperty具有“out”语义,即没有set访问器。


推荐阅读