使用类型参数继承泛型类的协变是子类
我想构建一个MVVM项目。我需要构建一个包含一些ViewModel的集合。
这些ViewModel是泛型类。和一些模型是相似的。例如三角形和矩形的形状......
我想将它们收集到一个集合中。所以集合使用基类类型。
问题是这些继承ViewModels不会被认为是Subclasse的。
这是一个场景:
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行是错误的。
答案 0 :(得分:1)
VMB实现VM&lt; MB&gt;,这意味着VMB可能包含类似的方法(仅作为示例,它取决于VM&lt; T&gt;定义):MB GetModel()或void SetModel(MB m)。
VMS&LT; I&GT;实现VM&lt; I&gt;,它意味着VMS&lt; I&gt;应该包含具有相同VM&lt; T&gt;的I GetModel()或void SetModel(I m)。定义
GetModel / SetModel方法有两个不同的签名和一些compliation问题。因此,您不能简单地将VMB转换为VM&lt; I&gt;并在你的收藏VMList中使用它。