Метод возвращает List, когда метод возвращает тип IEnumerable.But GetType отображается как List - PullRequest
0 голосов
/ 04 февраля 2019

Хотя приведенный ниже вопрос кажется глупым, но, тем не менее, он помог бы и другим.У меня есть метод, который возвращает список. И метод, возвращающий тип IEnumnerable.Метод:

public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public static IEnumerable<Person> GetPersons()
        {
            List<Person> personList = new List<Person>()
                                          {
                                              new Person() { Age = 10, Name = "Vijay"}
                                          };

           return personList;

        }
    }

Теперь, когда я вызываю этот метод и проверяю тип. Вывод будет

System.Collections.Generic.List

, так как это список.Я должен быть в состоянии добавить предметы в список.Но система выдает ошибку компиляции.Ниже приведена часть исполнения:

public class Program
    {
        public static void Main(string[] ar)
        {
            var personList = Person.GetPersons();
            Console.WriteLine(personList.GetType()); //System.Collections.Generic.List
            personList.Add(new Person(){Age = 11, Name = "Ajay"}); // Compilation error
            Console.ReadKey();

        }
    }

Так что кто-нибудь может мне помочь с пониманием.Было бы здорово помочь.Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

IEnumerable не поддерживает добавление в него нового элемента.

IEnumberable интерфейс от MSDN:

Предоставляет перечислитель, который поддерживает простую итерацию в неуниверсальной коллекции.

Вместо использования IEnumerable<Person> в качестве типа возврата GetPerson() используйте List<Person>.

Как

    public static List<Person> GetPersons()
    {
        List<Person> personList = new List<Person>()
                                      {
                                          new Person() { Age = 10, Name = "Vijay"}
                                      };

       return personList;

    }
0 голосов
/ 04 февраля 2019

IEnumerable Interface

Предоставляет перечислитель, который поддерживает простую итерацию по коллекции указанного типа.

Вот и всевсе это делаетТеперь есть много методов расширения, которые работают с IEnumerable, хотя это просто так Add не является одним из них

List<T>, реализует IEnumerable, что имеет смысл, и у него есть возможностьДобавить.

Итак, у вас есть 2 варианта

  1. Возврат List<T>

    • public static List<Person> GetPersons()
  2. Перечислите ваши IEnumerable в List<T>

    • var personList = Person.GetPersons().ToList();

Какой долженты используешь?Тот факт, что вы пытаетесь что-то добавить и просто не перечисляете это, или используете это в выражении Linq, говорит о том, что вам, вероятно, следует использовать опцию 1


Но всякий раз, когда вызывающийвызывает метод и получает тип метода.Он все еще отображается как System.Collections.Generic.List.Не могли бы вы объяснить, почему GetType отображается как List

Поскольку это был созданный тип, когда вы возвращаете IEnumerable, вы просто приводите List<T> как более фундаментальный тип (в данном случаеинтерфейс).Когда вы вызываете GetType , он сообщает вам, какой это тип, потому что он IS этого типа.Компилятор все еще знает, какой тип вы создали!в случае, если вы хотите отбросить его обратно.

Я думаю, вам нужно немного больше узнать о документации

0 голосов
/ 04 февраля 2019

Интерфейс IEnumerable отвечает за итерацию по коллекции, а не по хранилищу и добавлению / удалению.Таким образом, чтобы разрешить добавление в список, вы можете изменить тип возвращаемого значения на List<Person> следующим образом:

public static List<Person> GetPersons()
[...]

И все должно работать.

Хотя ваш метод возврата действительно возвращает List,говоря, что тип возвращаемого значения - это IEnumerable, который вы говорите пользователю вашей функции, следует только повторять, а не изменять.Именно поэтому вы получаете ошибку компиляции.

...