泛型类型的接口实现失败,因为"没有匹配的返回类型"错误

时间:2015-08-28 21:56:33

标签: c# generics interface

我有一个班级:

 public abstract class Structure<T, S> : IStructure
    where T : StructureModel<S>, new()
    where S : StructureStats, new()
{
    protected T _model;

    public S Stats { get { return _model.Stats; } set { _model.Stats = value; } }

}

和界面:

public interface IStructure
{
    StructureStats Stats{ get; set;}
}

代码无法编译,并带有消息

  

错误28&#39; Server.Models.Structures.Structure&#39;没有实现接口成员&#39; Server.Models.Structures.IStructure.Stats&#39;。 &#39; Server.Models.Structures.Structure.Stats&#39;无法实现&#39; Server.Models.Structures.IStructure.Stats&#39;因为它没有匹配的返回类型&#39; Server.Models.Structures.StructureStats&#39;。 C:\ SRDevGit \ freecon星系服务器\ SRServer \ Server.Models \结构\ Structure.cs

我不确定问题是什么; Structure.Stats {get;}的返回类型应该保证与接口定义匹配,因为泛型类型S被定义为从StructureStats派生

where S:StructureStats, new()

我错过了什么?如果可能的话,我想避免使IStructure变得通用,因为它会使

的集合复杂化
<IStructure<GenericType>>

因为GenericType是一个多态类。

2 个答案:

答案 0 :(得分:4)

C#是强类型的,而不支持协变返回类型,因此要从IStructure继承,Structure必须返回确切的签名StructureStats Stats{ get; set;}。像StructureStatsDerived Stats{ get; set;}这样的东西不完全匹配,编译器拒绝它。

看起来你实际上并不需要通用参数S.你可以删除S并返回StructureStats。

答案 1 :(得分:0)

没有使用通用接口就无法实现它,您还需要在self.response.write(template.render(extracted_output=extracted_output)) 的通用约束中切换顺序

Structure<T, S>