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

本文关键字:返回类型 错误 接口 泛型 | 更新日期: 2023-09-27 18:21:00

为什么我会出现这个错误,以及当我无法更改接口时如何解决它。。。(您可以将代码复制/粘贴到空的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; }
    }
}

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

实际上,您的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,那么您可能将这两个想法结合得太紧密了。

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

只需在Implementer类上将public EntitySet<Entity> Set {get; set;}更改为public IEntitySet<IEntity> Set {get; set;}即可。