定义IEnumerable <otherInterface>的接口

时间:2019-07-03 09:09:41

标签: c# generics interface ienumerable

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返回类型

2 个答案:

答案 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>