c# - 当涉及泛型时,如何正确地将我的子类转换为其基类?

标签 c# generics inheritance polymorphism

我正在尝试像这样覆盖一个基本属性:

public class Node {}
public class SubNode : Node { }

public class NodeViewModel<T> where T : Node
{
    public virtual T Data { get; set; }
}
public class SubNodeViewModel : NodeViewModel<SubNode>
{
    public override SubNode Data { get; set; }
}

...
List<NodeViewModel<Node>> l = new List<NodeViewModel<Node>>();
l.Add(new SubNodeViewModel()); // Cannot convert from SubNodeViewModel to NodeViewModel<Node>
...

我想我一定是误解了继承的基本原理。为什么我做不到?

我想我对这为什么有效感到困惑:

Node node;
SubNode subnode;
node = subnode; // I work just fine!

但不是这个:

NodeViewModel<Node> node;
SubNodeViewModel subnode;
node = subnode; // I don't work. Also, I hate you!

最佳答案

您无法执行此操作,因为 NodeViewModel<T>不是 covariant关于它的类型参数 T : NodeViewModel<Node>不是 NodeViewModel<SubNode> 的“基类” , 即使Node SubNode 的基数.从技术上讲,这与继承无关。

如果你想拥有各种NodeViewModel在同一个列表中,唯一的方法是使用公共(public)接口(interface)或基类作为列表的类型参数。

关于c# - 当涉及泛型时,如何正确地将我的子类转换为其基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22962276/

相关文章:

c# - 如何测试我的套接字异常处理代码?

Python:在初始评估后向类添加父类

java - 在同一个包中编译两个类

c# - 检查列表包含字符串

c# - 如何区分 "real"邮件附件和html邮件中的图片?

c# - 如何从代码后面设置 PathIcon?

协议(protocol)扩展内关联类型的快速初始化

java - 如何获取通用类中继承方法内的属性值?

c# - 仅调用泛型的基本方法

c++ - C++中lambda函数的继承参数