public interface IValue
{
int id {get; set;}
float val {get; set;}
}
public class Value:IValue
{
public int id {get; set;}
public float val {get; set;}
}
public interface IIvalueIEnum<T>
where T:IValue
{
IEnumerable<T> list {get; set;}
}
public class Collection:IIvalueIEnum<Value>
{
public List<Value> list {get; set;}
}
如何制作?我收到“集合无法实现IIvalueIEnum,因为它没有匹配的IEnumerable返回类型
答案 0 :(得分:4)
错误消息已清除。该属性应具有与接口中指定的签名相同的签名。这意味着List<Value> list
不能被视为IEnumerable<Value> list
的实现。
这实际上是合乎逻辑的事情。该接口表示list
可以包含任何集合,包括数组,列表,队列以及实现IEnumerable<T>
的任何集合。这应该编译:
IIvalueIEnum<Value> someEnum=...;
someEnum.list = new []{new Value()};
该属性只接受List<Value>
个项目,这意味着它不能接受interface属性指定的值。
班级应更改为:
public class Collection:IIvalueIEnum<Value>
{
public IEnumerable<Value> list {get; set;}
}
我怀疑属性只是读取现有集合所需的,而不是分配新的IEnumerable<T>
。该属性可能应该是只读的,并指向实际的集合:
public interface IIvalueIEnum<T>
where T:IValue
{
IEnumerable<T> list {get;}
}
public class Collection:IIvalueIEnum<Value>
{
public IEnumerable<Value> list =>ActualList;
public List<Value> ActualList{get;set;}
}
答案 1 :(得分:0)
好吧,根据接口,您的list
属性需要返回IEnumarable<T>
,但是在实现中它会返回List<Value>
,这是不一样的!
您知道,根本不需要任何IIvalueIEnum
...您可以只使用IEnumerable<IValue>
。或者,如果您希望能够向集合中添加值,则使用ICollection<IValue>
。