【问题标题】:Define an interface of IEnumerable<otherInterface>定义一个 IEnumerable<otherInterface> 的接口
【发布时间】:2019-07-03 09:09:41
【问题描述】:
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 返回类型

【问题讨论】:

  • 错误信息很清楚。该属性应具有与接口中指定的签名相同的签名。这意味着List&lt;Value&gt; list 不能被视为IEnumerable&lt;Value&gt; list 的实现
  • 根据界面要求将Collection.list的类型改为IEnumerable&lt;Value&gt;

标签: c# generics interface ienumerable


【解决方案1】:

错误信息很清楚。该属性应具有与接口中指定的签名相同的签名。这意味着List&lt;Value&gt; list 不能被视为IEnumerable&lt;Value&gt; list 的实现。

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

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

该属性虽然只接受List&lt;Value&gt; 项,这意味着它不能接受接口属性指定的值。

该类应更改为:

public class Collection:IIvalueIEnum<Value>
{
    public IEnumerable<Value> list {get; set;}
}

我怀疑该属性仅用于读取现有集合,而不是分配新的IEnumerable&lt;T&gt;。该属性可能应该是只读的并指向实际的集合:

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

【讨论】:

    【解决方案2】:

    好吧,根据接口你的list属性需要返回IEnumarable&lt;T&gt;,但是在实现中它返回List&lt;Value&gt;,这不一样!

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

    【讨论】:

    • 这并不完全正确。你不能使用ICollection&lt;IValue&gt;,因为它不是协变的。您无法为 ICollection&lt;IValue&gt; 返回 List&lt;Value&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多