【发布时间】:2017-08-24 11:46:10
【问题描述】:
带有类型参数的继承泛型类的协变是子类
我想构建一个 MVVM 项目。我需要构建一个集合来包含一些 ViewModel。
这些 ViewModel 是通用类。和一些模型是相似的。比如三角形和矩形的形状...
我想将它们收集到一个集合中。所以集合使用基类类型。
问题是这些 Inherit ViewModel 不会被识别为 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 行是错误的。
【问题讨论】:
-
仅仅因为两种类型之间恰好具有特定的继承关系,并不意味着由这些类型参数化的单个泛型类型具有相同 i> 继承关系。
List<string>not 也是List<object>,因为如果您能够进行该演员表,您可以将 anything 存储到该列表中。 -
“我想构建一个 MVVM 项目。我需要构建一个集合来包含一些 ViewModel。”也许看看 MVVM light 是如何做到这一点的,并从中获得灵感……
-
非常感谢
-
**非常感谢你们俩 **这个问题让我困惑了好几个星期。随着你的解释,我意识到 List
不是 List A List 变体不能接受 List 实例。因为变种接受了 Dog 实例不谢谢你澄清我!你太棒了。
标签: c# .net generics inheritance