Почему это IEnumerable.Empty <T>(), а не IEnumerable <T>.Empty ()? - PullRequest
0 голосов
/ 18 ноября 2010

Если вы хотите создать пустой IEnumerable типа T, вы можете создать его с помощью статического универсального метода

Enumerable.Empty<T>()

См. здесь для получения дополнительной информации.

Почему Microsoft выбрала эту опцию вместо использования статического метода для универсального типа (в отличие от универсального статического метода для неуниверсального типа)?

Этот метод можно использовать следующим образом:

Enumerable<T>.Empty()

Что бы потом вернуть пустое IEnumerable<T>.

По моему мнению, второй вариант имеет больше смысла, поскольку я хочу создать общий IEnumerable<T>, а неуниверсальный IEnumerable.

Редактировать: опечатка

Ответы [ 2 ]

12 голосов
/ 18 ноября 2010

IEnumerable<T> является интерфейсом.
Интерфейсы не могут содержать статические элементы.

Статический метод фактически относится к типу Enumerable, который не является универсальным static class.
Следовательно, нет универсального класса Enumerable<T>, который мог бы содержать метод.

Следует избегать статических членов в универсальных типах .
Методы расширения нельзя поместить в универсальный тип.
Вот почему статический класс Enumerable не является универсальным.

3 голосов
/ 18 ноября 2010

Существует статический класс с именем Enumerable, для которого определен этот метод. Не существует статического класса с именем Enumerable<T>. Это связано с тем, что Enumerable определяет методы расширения для IEnumerable<T> (все такие методы имеют универсальный параметр T), а методы расширения не могут существовать в универсальных классах. Вот почему Empty<T> определяется как таковое.

Из §10.6.9 спецификации:

Методы расширения могут быть объявлены только в неуниверсальных, не вложенных статических классах.

...