Определить интерфейс IEnumerable <otherInterface> - PullRequest
0 голосов
/ 03 июля 2019
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 ]

4 голосов
/ 03 июля 2019

Сообщение об ошибке ясно.Свойство должно иметь ту же подпись, что и указанная в интерфейсе.Это означает, что List<Value> list нельзя считать реализацией IEnumerable<Value> list.

Это на самом деле логично.Интерфейс говорит, что list может содержать любую коллекцию, включая массивы, списки, очереди, все, что реализует IEnumerable<T>.Это должно скомпилировать:

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

Хотя свойство принимает только List<Value> элементов, что означает, что оно не может принимать значения, определенные свойством интерфейса.

Класс должен измениться на:

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;}
}
0 голосов
/ 03 июля 2019

Ну, в соответствии с интерфейсом ваше свойство list должно возвращать IEnumarable<T>, но в реализации оно возвращает List<Value>, что не то же самое!

Знаете, вам не нужнолюбой IIvalueIEnum вообще ... вы можете просто использовать IEnumerable<IValue>.Или ICollection<IValue>, если вы хотите иметь возможность добавлять значения в коллекцию.

...