将泛型类转换为父C#

时间:2018-07-28 07:52:09

标签: c# generics

我的问题可能古老而愚蠢,但请帮助我。

这是我的代码:

<xp:this.beforePageLoad><![CDATA[#{javascript:
    // Do not cache the HTML pages in the browser
    var exCon = facesContext.getExternalContext();
    var response=exCon.getResponse();
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Cache-Control", "no-store");
}]]></xp:this.beforePageLoad>

public class Program { public static void Main(string[] args) { var first = new ChildClass(); var result = new List<ParentGenericClass<ITypeInterface>>(); result.Add(first); } } public interface ITypeInterface { } public class TypeClass : ITypeInterface { } public class ParentGenericClass<TObject> where TObject : ITypeInterface { } public class ChildClass : ParentGenericClass<TypeClass> { } TypeClass的子代,而ITypeInterfaceChildClass的子代。

为什么我不能将ParentGenericClass转换为ChildClass? 我认为应该可以。

我想念什么?

我已经搜索了ParentGenericClass<ITypeInterface>generic等关键字,但找不到很好的答案。

1 个答案:

答案 0 :(得分:1)

这是一个 variance 问题,仅在接口而非类上支持使用协变out

  

协方差使您可以使用比最初指定的类型更多的派生类型。

事实是,ChildClass实际上与ParentGenericClass<ITypeInterface>

不同

一种选择是重构为类似的东西

public interface IParentGenericClass<out TObject> where TObject : ITypeInterface
{
}

public class ParentGenericClass<TObject> : IParentGenericClass<TObject>
where TObject : ITypeInterface
{
}
...

var result = new List<IParentGenericClass<ITypeInterface>>();
result.Add(first);