定义一个IEnumerable<otherInterface>的接口

Define an interface of IEnumerable<otherInterface>

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 因为它没有匹配的 return 类型的 IEnumerable

嗯,根据接口你的 list 属性 需要 return IEnumarable<T>,但是在实现中它 returns List<Value>,这是不一样的!

你知道,你根本不需要任何 IIvalueIEnum...你可以只使用 IEnumerable<IValue>。或者 ICollection<IValue> 如果您希望能够向集合中添加值。

错误信息很清楚。 属性 应具有与接口中指定的签名相同的签名。这意味着 List<Value> list 不能被视为 IEnumerable<Value> list.

的实现

这实际上是合乎逻辑的事情。该接口表示 list 可以包含任何集合,包括数组、列表、队列以及任何实现 IEnumerable<T> 的东西。这应该编译:

IIvalueIEnum<Value> someEnum=...;
someEnum.list = new []{new Value()};

属性 虽然只接受 List<Value> 项,这意味着它不能接受接口指定的值 属性。

class 应更改为:

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;}
}