【问题标题】:Casting generic class with inheritance [duplicate]使用继承铸造泛型类[重复]
【发布时间】:2020-01-18 04:30:48
【问题描述】:

我想将泛型类转换为其基类型,具有类和类型继承。

我有这些课程:

public class Segment<K> : SomeStructure where K : SomeStructure{...}

public class XXXXXXData : Segment<Key> {...}

public class Key : SomeStructure {...}

我有一个名为 dataXXXXXXData 实例,但如果我像

data as Segment&lt;SomeStructure&gt; 它返回null

在我有这些代码的地方,变量可以是XXXXData 或任何类型的Segment&lt;&gt;。我该怎么做才能转换为 Segment&lt;AmtsCobolStructure&gt; 以便我可以使用这些基类的方法?

【问题讨论】:

  • 基类始终具有任何继承类的最小属性数。因此,您始终可以将基类强制转换为任何继承类,但不能将继承类强制转换为基类,因为继承类中的属性数量更多。您无需执行任何操作即可获取基类的属性,它们会自动成为继承类的一部分。
  • 仅仅因为两个类具有继承关系并不意味着使用第一个类作为泛型参数的泛型类具有相同的关系。事实上,他们没有任何东西共同点。
  • @HimBromBeere:你完全错了。继承的类具有基类的所有属性。
  • @jdweng Huuum?我从来没有怀疑过这一点。我只是说泛型类没有任何共同点,即使它们的泛型 arguments

标签: c# generics inheritance casting


【解决方案1】:

你不能在 C# 中做到这一点。您只能通过在顶层引入一个通用接口来做到这一点,该接口使用out 对通用参数进行协变,例如:

public class Segment<K> : ISegment<K> where K : SomeStructure{...}

虽然你的界面应该是这样的:

public interface ISegment<out T>
{

}

您的转换代码现在将使用接口类型:

data as ISegment<SomeStructure>

check this demo fiddle as example.

【讨论】:

    猜你喜欢
    • 2021-06-14
    • 2013-01-25
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2011-08-19
    • 1970-01-01
    相关资源
    最近更新 更多