Сообщение об ошибке ясно.Свойство должно иметь ту же подпись, что и указанная в интерфейсе.Это означает, что 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;}
}