使用接口和泛型时没有匹配的返回类型错误

时间:2014-09-08 14:58:48

标签: c# inheritance interface

为什么我收到此错误,当我无法更改接口时如何解决此问题...(您可以将代码复制/粘贴到空的CS文件中)

namespace ClassLibrary1
{
    public interface IEntity
    {
    }

    public interface IEntitySet<T>
    {
    }

    public class Entity : IEntity
    {
    }

    public class EntitySet<T> : IEntitySet<T>
    {
    }

    public interface IImplementer
    {
        IEntitySet<IEntity> Set { get; set; }
    }

    public class Implementer : IImplementer
    {
        // Error 'ClassLibrary1.Implementer' does not implement interface member 'ClassLibrary1.IImplementer.Set'. 
        // 'ClassLibrary1.Implementer.Set' cannot implement 'ClassLibrary1.IImplementer.Set' 
        // because it does not have the matching return type of 'ClassLibrary1.IEntitySet<ClassLibrary1.IEntity>'.
        public EntitySet<Entity> Set { get; set; }
    }
}

2 个答案:

答案 0 :(得分:3)

确实,您的Set方法的返回类型为IEntitySet<IEntity>,但您尝试使用EntitySet<Entity>声明实现。那里有两个问题:

  • IEntitySet不是EntitySet
  • IEntity不是Entity

实现签名必须与接口完全匹配。

您可能应该IImplementer通用,如下所示:

public interface IImplementer<T> where T : IEntity
{
    IEntitySet<T> Set { get; set; }
}

此时,您可以:

public class Implementer : IImplementer<Entity>
{
    public IEntitySet<Entity> Set { get; set; }
}

然后你可以写:

var implementer = new Implementer();
implementer.Set = new EntitySet<Entity>();

这就是你想要的吗?如果真的需要强制Implementer使用EntitySet而不是IEntitySet,那么您可能会过于紧密地将这两个想法联系起来。

答案 1 :(得分:1)

您收到此异常是因为IImplementer需要IEntitySet<IEntity> Set属性,但您的Implementer类正在返回EntitySet<Entity>EntitySet可以转换为IEntitySet,但IEntitySet 无法转换为EntitySet,因此您的接口实现失败,因为您不满足接口

只需在public EntitySet<Entity> Set {get; set;}课程中将public IEntitySet<IEntity> Set {get; set;}更改为Implementer