Ошибка: список <int>не соответствует 'System.Collections.Generic.IEnumerable <int> - PullRequest
2 голосов
/ 15 сентября 2010

Как реализовать элементы интерфейса "f" со списком?

public interface I
{
    IEnumerable<int> f { get; set; }
}

public class C:I
{
    public List<int> f { get; set; }
}

Ошибка 1 'ClassLibrary1.C' не реализует элемент интерфейса 'ClassLibrary1.I.f'.ClassLibrary1.Cf не может реализовать ClassLibrary1.If, поскольку у него нет соответствующего возвращаемого типа System.Collections.Generic.IEnumerable.c: \ users \ admin \ documents \ visual studio 2010 \ Projects \ ClassLibrary1 \ Class1.cs

Ответы [ 2 ]

6 голосов
/ 15 сентября 2010

Вы можете использовать вспомогательное поле типа List<int>, но выставьте его как IEnumerable<int>:

public interface I
{
    IEnumerable<int> F { get; set; }
}

public class C:I
{
    private List<int> f;
    public IEnumerable<int> F
    {
        get { return f; }
        set { f = new List<int>(value); }
    }
}
1 голос
/ 15 сентября 2010

Вы также можете скрыть IEnumerable<int> f из I, указав интерфейс явно.

public class C : I
{
    private List<int> list;

    // Implement the interface explicitly.
    IEnumerable<int> I.f
    {
        get { return list; }
        set { list = new List<int>(value); }
    }

    // This hides the IEnumerable member when using C directly.
    public List<int> f
    {
        get { return list; }
        set { list = value; }
    }
}

При использовании вашего класса C виден только один f член: IList<int> f. Но когда вы приведете свой класс к I, вы снова сможете получить доступ к члену IEnumerable<int> f.

C c = new C();
List<int> list = c.f;   // No casting, since C.f returns List<int>.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...