使用接口和泛型时没有匹配的返回类型错误
本文关键字:返回类型 错误 接口 泛型 | 更新日期: 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;}
即可。