В ролях: Список стран: Список <Country> - PullRequest
0 голосов
/ 31 августа 2018

Я создал профиль страны

public class Country
{
   public string Name { get; set;}
}

и список стран

public class Countries : List<Country>
{}

и теперь я хочу назначить переменную типа List для стран

Countries countries = new List<Country>(new Country[] {new Country()});

но это, к сожалению, не работает. Это говорит

невозможно преобразовать Список в Страны

в чем может быть причина? я должен изменить список на что-то другое?

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Вы не можете неявно приводить список, который.

Вам нужно дать вашему Countries классу конструктор:

public class Countries : List<Country>
{
    public Countries(Country[] countries) : base(countries)
    {
    }
}

А потом назовите это:

Countries countries = new Countries(new Country[] {new Country()});
0 голосов
/ 31 августа 2018

Я собираюсь ответить на ваш вопрос, упростив вашу архитектуру. Нет причин наследовать от списка. См. Этот ответ для получения дополнительной информации Если вы хотите инкапсулировать свою логику для своей страны, просто укажите свойство для списка стран. Ваша модель не нуждается в расширении функциональности списка.

public class Countries
{
    protected IEnumerable<Country> _countries;
    public Countries(IEnumerable<Country> countries)
    {
        this._countries = countries;
    }
}

Тогда вы можете инициализировать так:

var countries = new Countries(new Country[] {new Country()});
0 голосов
/ 31 августа 2018

Класс Countries происходит от List<Country>, что означает, что он более конкретен. Вы не можете назначить более общий класс для ссылки, предназначенной для чего-то более конкретного.

Countries countries = new List<Country>(); //Won't work
String s = new object(); //Won't work

Вы можете назначить для общего, например,

List<Country> countries = new Countries();  //Will work
object o = ""; //Will work

Если у вас есть List<Country> и вам нужно преобразовать его в Countries объект, вы можете сделать это, реализовав один из конструкторов, который позволяет заполнять список, например так:

public class Country
{
    public string Name { get; set; }
}

public class Countries : List<Country>
{
    public Countries(IEnumerable<Country> initializationData) : base(initializationData)
    {
        //No body. Work is done by base class constructor.
    }
}

Теперь вы можете:

List<Country> list = new List<Country>();
Countries countries = new Countries(list);

Обратите внимание, что этот список дублирует, а не преобразует список, поэтому вы получите две ссылки на два разных объекта, которые содержат одинаковые данные. Это единственный способ сделать это.

...