c# - 为什么 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();
以及是否有任何解决方法?
解决方案
(从评论中提升。)
SomeGenericClass<T>
在 中不能是协变的T
。
首先,泛型中的协变仅支持interface
anddelegate
类型,不支持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
访问器。
推荐阅读
- gitlab-ci - gitlab-ci - 具有不同分支的多个阶段的作业
- android - 当我使用消失/可见时重新计算重量布局
- javascript - 我可以参考/加载一个
- c++ - 给定一个宏,如何指定一个指向类成员函数的指针?
- python-3.x - 使用 scipy ndimage.measurements.center_of_mass 的质心错误
- javascript - Three.js程序返回:“无法读取未定义的属性'0'”
- ios - 更改 NSObject 定义导致无法识别的选择器
- c# - 模型绑定类属性的子集
- multipartform-data - 如何在 Node-RED 中创建多部分 HTTP 请求
- docker - 如何在多个 docker 容器和主机之间创建隧道?