gpt4 book ai didi

c# - 具有类型参数的继承泛型类的协变是子类

转载 作者:太空宇宙 更新时间:2023-11-03 12:24:18 24 4
gpt4 key购买 nike

具有类型参数的继承泛型类的协变是子类

我想构建一个 MVVM 项目。我需要构建一个集合来包含一些 ViewModel。

这些 ViewModel 是通用类。和一些模型是相似的。例如三角形和矩形的形状...

我想将它们收集到一个集合中。所以集合使用基类类型。

问题是这些继承的 ViewModel 不会被识别为子类的。

这是一个场景:

namespace WpfApp1
{
public interface I { } //interface

public class M : I { } //Model base
public class MA : M { } //Modle A
public class MB : M { } //Modle B

public class VM<T> where T : class, I { } //ViewModel Base
public class VMS<T> : VM<T> where T : class, I { }//ViewModel Base

public class VMA : VMS<MA> { } //ViewModel A
public class VMB : VMS<MB> { } //ViewModel B


public class Problem
{
List<VMS<I>> VMList = new List<VMS<I>>(); //


public void StupidThing() // F: fail O: Ok
{
VMList.Add(new VMB()); // F why?

VMS<I> a = new VMB(); //1 F why?
VMS<M> b = new VMB(); //2 F why?
VMS<MA> c = new VMB(); //3 F
VMS<MB> d = new VMB(); //4 O
VMA e = new VMB(); //5 F
VMB f = new VMB(); //6 O
}
}
}

StupidThing函数中,我知道第3行和第5行是错误的,第4行和第6行没问题。但为什么第 1,2 行是错误的。

最佳答案

VMB 实现 VM ,这意味着 VMB 可能包含如下方法(这只是示例,它取决于 VM 定义):MB GetModel() 或 void SetModel(MB m)。

VMS 实现 VM,这意味着 VMS 应该包含具有相同 VM 定义的 I GetModel() 或 void SetModel(I m)。

GetModel/SetModel 方法有两种不同的签名和一些编译问题。因此,您不能简单地将 VMB 转换为 VM 并在您的集合 VMList 中使用它。

关于c# - 具有类型参数的继承泛型类的协变是子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45860788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com