Реализация IEnumerable в производной коллекции List

#c#

#c#

Вопрос:

Я получаю сообщение об ошибке. Вот код, скопированный в консольный проект и урезанный:

 namespace ConsoleApplication1
{
public interface IHexGrid
{ 
    IEnumerable<Hex> hexs { get; } //error related location
}

public class HexC : Hex
{ public int var1;}

public abstract class Hex
{ public int var2; }    

public class HexGridC : IHexGrid //error CS0738
{        
    public List<HexC> hexs { get; set; } // error related location
}    

class Program
{        
    static void Main(string[] args)
    {
    }
}
}
  

Я получаю следующее: ошибка CS0738:

 'ConsoleApplication1.HexGridC' does not implement interface
member 'ConsoleApplication1.IHexGrid.hexs'. 'ConsoleApplication1.HexGridC.hexs' cannot 
implement 'ConsoleApplication1.IHexGrid.hexs' because it does not have the matching 
return type of '`System.Collections.Generic.IEnumerable<ConsoleApplication1.Hex>`'.
  

Не уверен, почему, поскольку IEnumerable является ковариантным. Любая помощь приветствуется.

Редактировать: код был упрощен

Комментарии:

1. Честно говоря, это сообщение об ошибке компиляции не может быть намного лучше, чем это… он точно скажет вам, что делать :)

Ответ №1:

Проблема в том, что ваше свойство имеет неправильный тип. C # не поддерживает ковариантные возвращаемые типы для свойств или методов, указанных в интерфейсах, или для переопределения виртуального метода. Вы можете использовать явную реализацию интерфейса, хотя:

 public class HexGridC : IHexGrid //error CS0738: etc
{        
    public GridElList<HexC> hexs { get; set; } // error related location

    IEnumerable<Hex> IHexGrid.hexs { get { return hexs; } }
}
  

Кроме того, все это кажется ужасно сложным кодом — и, как правило, это не очень хорошая идея для получения List<T> в первую очередь. (Предпочтительная композиция или производная от Collection<T> которой предназначена для наследования.) Действительно ли это должно быть так сложно? Если это произойдет, все равно стоило бы сократить сложность примера ради вопроса.

Комментарии:

1. Я считаю, что это должно быть настолько сложно, но приношу извинения за то, что не упростил вопрос с самого начала. Я забыл об ограничении свойств интерфейса. Я думаю, вы могли бы использовать другое имя свойства и просто сделать явный возврат в get, но использование явной реализации интерфейса действительно аккуратно! Спасибо.