Неуниверсальный тип System.Collections.IEnumerable нельзя использовать с аргументами типа. - PullRequest
9 голосов
/ 03 августа 2011
using System.Collections.Generic;

public sealed class LoLQueue<T> where T: class
{
    private SingleLinkNode<T> mHe;
    private SingleLinkNode<T> mTa;

    public LoLQueue()
    {
        this.mHe = new SingleLinkNode<T>();
        this.mTa = this.mHe;
    }
}

Ошибка:

The non-generic type 'LoLQueue<T>.SingleLinkNode' cannot be used with type arguments

Почему я получаю это?

Ответы [ 3 ]

24 голосов
/ 03 августа 2011

Если вы хотите использовать IEnumerable<T>, как следует из названия вашего поста, вам нужно включить using System.Collections.Generic;.

Что касается класса SingleLinkNode, я не знаю, где вы его взяли, это не так.часть платформы .NET, которую я вижу.Я предполагаю, что это не реализовано с использованием дженериков, и вам нужно будет добавить кучу приведений от object до T везде.

2 голосов
/ 03 августа 2011

Это компилируется для меня:

public sealed class SingleLinkNode<T>
{

}

public sealed class LoLQueue<T> where T : class
{
    private SingleLinkNode<T> mHe;
    private SingleLinkNode<T> mTa;

    public LoLQueue()
    {
        this.mHe = new SingleLinkNode<T>();
        this.mTa = this.mHe;
    }
}

Вам нужно будет опубликовать свой класс SingleLinkNode для дальнейших ответов ...

Джон

2 голосов
/ 03 августа 2011

Я почти уверен, что вы не определили свой класс SingleLinkNode как имеющий параметр общего типа. Таким образом, попытка объявить это с одним провалом.

В сообщении об ошибке указывается, что SingleLinkNode является вложенным классом, поэтому я подозреваю, что может происходить то, что вы объявляете члены SingleLinkNode типа T, фактически не объявляя T как универсальный параметр для SingleLinkNode. Вам все еще нужно сделать это, если вы хотите, чтобы SingleLinkNode был универсальным, но если нет, то вы можете просто использовать класс как SingleLinkNode вместо SingleLinkNode<T>.

Пример того, что я имею в виду:

public class Generic<T> where T : class
{
    private class Node
    {
        public T data; // T will be of the type use to construct Generic<T>
    }

    private Node myNode;  // No need for Node<T>
}

Если вы делаете хотите, чтобы ваш вложенный класс был универсальным, тогда это будет работать:

public class Generic<T> where T : class
{
    private class Node<U>
    {
        public U data; // U can be anything
    }

    private Node<T> myNode;  // U will be of type T
}
...