为什么我收到此错误,当我无法更改接口时如何解决此问题...(您可以将代码复制/粘贴到空的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; }
}
}
答案 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
。