我试图像这样重写基本属性:

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>类不是协变的。是否可以执行此操作取决于您需要支持的操作,但是对于问题中的代码,您可以创建一个接口:

public interface INodeViewModel<out T> where T : Node
{
    T Data { get; }
}


然后实施

public NodeViewModel<T> : INodeViewModel<T> where T : Node { ... }


然后更改l中项目的类型:

List<INodeViewModel<Node>> l = new List<INodeViewModel<Node>>();

10-04 10:08