Вопрос 1: Технически вы не можете создать экземпляр интерфейса. Просмотрите https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1?view=netcore-3.1, чтобы узнать больше об интерфейсе c. Но, что более важно, интерфейс (в этом контексте) больше похож на контракт, который должен (иметь) класс. Так что любая коллекция может быть IEnumerable. Так, например, целочисленный массив реализует интерфейс:
IEnumerable<int> example = new[] { 1, 2, 3 };
будет работать нормально (при условии, что вы добавили пространство имен System.Collections.Generic
в использование).
Вопрос 2 : collections (в этом контексте) почти всегда являются ссылочными типами
Вопрос в заголовке: это может быть менее интересно для того, чего вы хотите достичь, но для получения дополнительной информации о фактическом возвращаемом типе: WhereEnumerableIterator
см. это ( немного глубже) объяснение: https://marcinjuraszek.com/2013/08/did-you-know-about-that-linq-feature.html Но, если вы хотите иметь возможность поместить полученную коллекцию в конкретный тип коллекции по вашему выбору, вы можете просто создать свой собственный новый экземпляр коллекции, например, добавление ToArray из пространства имен System.Linq
, например:
int[] result = (from value in Enumerable.Range(0, 10) where value%2==0 select value).ToArray();
'result', в свою очередь, реализует IEnumerable<int>
. В общем, интерфейсы отделяют фактические реализации от желаемого поведения. Таким образом, вам действительно не нужно беспокоиться о базовом конкретном классе, но сосредоточьтесь на том, что вам нужно (набор целых чисел в коллекции, которую вы хотите l oop).
Надеюсь, это поможет / немного объясняет ..