Конструктор List<T>(IEnumerable<T>)?

442
26 ноября 2017, 12:03

Добрый день. Возник вопрос следующего характера: согласно офф. документации с MSDN

-сам конструктор имеет следующий вид:

List<T>(IEnumerable<T>)

- т.е. список я параметризую неким параметром T, а в качестве аргумента могу передать элементы из указанной коллекции:

Инициализирует новый экземпляр List, который содержит элементы, скопированные из указанной коллекции, и имеет емкость, достаточную для размещения всех скопированных элементов.

И как я понимаю параметр в IEnumerable<T> может быть отличным от List<T>

Тогда вопрос, почему возникает такая ошибка:

public class ParticleGenericClass<Particle> : IEnumerable
 {
IEnumerator IEnumerable.GetEnumerator()
{
    throw new NotImplementedException();
}
  ParticleGenericClass<Particle> Pg = new ParticleGenericClass<Particle>();
      Particles = new List<int>(Pg) ;

ошибка возникает на строке:

Particles = new List<int>(Pg) ;
  • Аргумент 1: не удается преобразовать из "ParticleGenericClass<UnityEngine.Particle>" в "System.Collections.Generic.IEnumerable<int>".
    Upd: как я понял необходимо при реализации данного интерфейса сделать так:

     public class ParticleGenericClass<Particle> : IEnumerable<Particle>
      {
    
     IEnumerator<Particle> IEnumerable<Particle>.GetEnumerator()
    {
       throw new NotImplementedException();
     }
     IEnumerator IEnumerable.GetEnumerator()
      {
            throw new NotImplementedException();
      }
    }
    
    • но проблему это не решило
Answer 1

Потому что ваш класс ParticleGenericClass<Particle> : IEnumerable реализует IEnumerable, но не IEnumerable<Particle>.

А для List<Particle> нужно IEnumerable<Particle>.

То, что сам ParticleGenericClass является обобщённым классом с параметром Particle, не имеет значения. Нужна реализация (прямо или косвенно) IEnumerable<Particle>.

Проще всего, думаю, просто реализовать IEnumerable<Particle> в вашем классе ParticleGenericClass<Particle>.

Окей, новая проблема в том, что у вас неправильный тип generic-параметра.

Конструктор List<T> описан как принимающий параметр типа IEnumerable<T>. Видите, и там, и там T.

T не обозначает «короче какой-то generic-параметр». Как и с аргументами функций, одно и то же имя означает одну и ту же сущность. То есть, последовательность должна иметь именно тот же тип данных, что и список. А вы из последовательности Particle'ов пытаетесь построить список int'ов. Подумайте сами: каким образом компилятор узнает, как из Particle построить int?

READ ALSO
Унаследовать форму

Унаследовать форму

Хочу создать форму на основе существующейПытаюсь унаследовать базовую форму-родителя: public partial class Order : EmployeeClass

227
Удовлетворяет ли строка условию?

Удовлетворяет ли строка условию?

Есть массив фильтров, к примеру

316
Зачем нужен атрибут [JsonProperty]

Зачем нужен атрибут [JsonProperty]

Приветствую! Собственно вопрос в заголовке - для чего используется атрибут [JsonProperty("PropertyName")] в классе при сериализации или десериализации...

225
UpCast C#.Override и Virtual

UpCast C#.Override и Virtual

При создании класса

239