#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, но использование явной реализации интерфейса действительно аккуратно! Спасибо.