【问题标题】:Class with Iiherited Generic Type convert to class with base Generic Type具有 Iiherited 泛型类型的类转换为具有基本泛型类型的类
【发布时间】:2020-08-26 19:42:10
【问题描述】:

我有一个泛型类型的类:

class SomeClass<T>
{

}

还有两个类 -> 一个继承自另一个:

class Animal
{

}

class Lion : Animal
{

}

现在我想用基本泛型创建一个“SomeClass”变量,并给它一个继承类型作为泛型类型的对象,如下所示:

    void Test()
    {
        SomeClass<Lion> someLion = new SomeClass<Lion>();

        SomeClass<Animal> someAnimal = someLion;    //Error line

    }

错误是:

无法将类型“VitrasUI.SomeClass”隐式转换为“VitrasUI.SomeClass”

据我了解,我应该能够以这种方式转换它,因为它也适用于 IEnumerables:

    void Test1()
    {
        IEnumerable<Lion> listLion = new List<Lion>();

        IEnumerable<Animal> listAnimal = listLion;
    }

【问题讨论】:

  • 在 C# 中搜索协变和逆变
  • 协方差不适用于泛型类,仅适用于接口。 IEnumerable 声明为IEnumerable&lt;out T&gt;,您可以使SomeClass 接口并使其与T 协变
  • (并且仅在声明为ISomeInterface&lt;out T&gt;时)
  • 一个IEnumerable&lt;T&gt; 仅用于获取Tout 个实例。使用List&lt;T&gt;(或IList&lt;T&gt;),您承诺您还可以将T 的实例放入。现在想象一个List&lt;Zebra&gt; 被转换为List&lt;Animal&gt;,然后将Lion 的实例放在那里。这会引起一些麻烦。
  • 我查了一遍,弄明白了。感谢您的快速回复。

标签: c# generics inheritance casting


【解决方案1】:

在一些 cmets 的帮助下,我很快就搞定了。

我做了什么:

1) 了解协方差和逆变

(这篇博文很容易理解:http://tomasp.net/blog/variance-explained.aspx/

2)我添加了一个接口,其中抽象类(由SomeClass表示)继承

3)我使用out关键字将泛型的用法标记为接口中的协变

【讨论】:

    猜你喜欢
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2020-03-27
    • 1970-01-01
    • 2018-09-20
    相关资源
    最近更新 更多