我的问题可能古老而愚蠢,但请帮助我。
这是我的代码:
<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
的子代,而ITypeInterface
是ChildClass
的子代。
为什么我不能将ParentGenericClass
转换为ChildClass
?
我认为应该可以。
我想念什么?
我已经搜索了ParentGenericClass<ITypeInterface>
,generic
等关键字,但找不到很好的答案。
答案 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);