Использование универсального типа 'System.Collections.Generic.IEnumerable <T> требует аргументов 1 типа

1

Мой код в С#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace cs
{
    public class TreeNode<T> : IEnumerable
    {
    }

И я получил ошибку здесь:

Ошибка 1 Использование универсального типа 'System.Collections.Generic.IEnumerable<T>' требует 1 аргумент типа

Теги:

4 ответа

11

Интерфейс IEnumerable объявлен в System.Collections, поэтому следует добавить следующее:

using System.Collections;

Существует также аналогичный интерфейс, IEnumerable<T>, который является общей версией IEnumerable и тот объявлен в System.Collections.Generic и именно поэтому Visual Studio дает вам такую загадочную ошибку.

2

Есть две "версии" IEnumerable.

Один из них - неподходящая System.Collections.IEnumerable. Это обеспечивается в основном для обратной совместимости. Я не могу думать о хорошей причине, чтобы новые классы непосредственно наследовали ее.

Другой - общий, System.Collections.Generic.IEnumerable<T>. Это также реализует IEnumerable, поэтому это лучший выбор во всех случаях.

Когда интерфейс имеет общую перегрузку, вам необходимо указать этот общий параметр типа. В твоем случае,

public class TreeNode<T> : IEnumerable<T>

Стоит отметить, что когда вы это реализуете, вам нужно реализовать два метода:

Enumerator<T> GetEnumerator(); // From IEnumerable<T>
Enumerator IEnumerable.GetEnumerator(); // From IEnumerable

Это не слишком необычно, так что верните this.GetEnumerator() из второго, так как он снова представлен как обратная совместимость. Вы всегда хотите, чтобы эти два счетчика возвращали одни и те же данные, чтобы было приятное и легкое решение.

  • 0
    Единственное хорошее использование IEnumerable, которое я знаю, - это использование его в качестве типа возврата для функций SQL CLR.
  • 0
    Может быть, я упускаю что-то очевидное, но мне не понятно, почему родовое лучше. Из вашего ответа просто выглядит, что его сложнее использовать (например, необходимо реализовать два метода).
Показать ещё 1 комментарий
2

Вам либо нужно

  • используйте нестандартную версию IEnumerable которая находится в пространстве имен System.Collection (которое вы не указали)
  • укажите тип для общей версии (более вероятно)

Пример для общей версии:

class TreeNode<T> : IEnumerable<T> 
{....}
-1

Вы должны использовать:

System.Collections.IEnumerable

вместо

IEnumberable или System.Collections.Generic.IEnumerable

Ещё вопросы

Сообщество Overcoder
Наверх
Меню