【问题标题】:Covariant of Inherit generic classes with type parameter is subclass具有类型参数的继承泛型类的协变是子类
【发布时间】: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&lt;string&gt; not 也是 List&lt;object&gt;,因为如果您能够进行该演员表,您可以将 anything 存储到该列表中。
  • “我想构建一个 MVVM 项目。我需要构建一个集合来包含一些 ViewModel。”也许看看 MVVM light 是如何做到这一点的,并从中获得灵感……
  • 非常感谢
  • **非常感谢你们俩 **这个问题让我困惑了好几个星期。随着你的解释,我意识到 List 不是 List A List 变体不能接受 List 实例。因为变种接受了 Dog 实例不谢谢你澄清我!你太棒了。

标签: c# .net generics inheritance


【解决方案1】:

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 中使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    相关资源
    最近更新 更多