使用泛型和单向链表(错误 CS0311)

Using generics and a singly linked list (error CS0311)

我的任务是使用单链表和泛型创建一个集合。为了创建一个单向链表,我做了一个特殊的 class,没什么特别的。

public class Node<T>
{
    public Node(string name)
    {
        Name = name;
    }
    public string Name { get; set; }
    public Node<T> Next { get; set; }
}

然后我制作了一个简短的界面,其中我写了所有必要的东西来使用列表。有一些片段要显示:

interface ICustomCollection<T>
{
    void Add(T item);
}

然后我在一个新的 class 集合中使用了这个接口:

class MyCustomCollection<T> : ICustomCollection<T> where T: Node<T>
{
    T head;
    T tail;
    T current;
    int count = 0;

    public void Add (T item)
    {
        Node<T> node = new(null);

        if (head == null)
        {
            head = (T)node;
        }
        else
        {
            tail.Next = node;
        }
        tail = (T)node;

        count++;
        current = tail;
    }
}

让它成为集合的所有功能。然后我创建了新的 class 名为 Person with name:

public class Person
{
    string name;
}

所以我需要创建一个 class 实例来使用该集合:

MyCustomCollection<Person> people;

但是现在我有一个编译器错误 CS0311,指出没有从“Person”到 'Node' 的隐式引用转换。我真的不明白该怎么做,我什至尝试做类似的事情:

public static explicit operator Node<Person>(Person person)
{
    return new Node<Person>(person.name){ Next = null, Name = person.name };
}

但它不起作用。你对此有什么想法吗?

您不想要求集合只能包含本身派生自 Node<T> 的内容。所以不要将其作为要求强加。只需在内部使用 Node<T>

class MyCustomCollection<T> : ICustomCollection<T>
{
    Node<T> head;
    Node<T> tail;
    Node<T> current;
    int count = 0;

到那时,您还可以考虑将 Node class 移到您的集合 class 中并将其设为私有(如果这样做,您将不再需要参数化 Node 本身,因为它可以使用集合的封闭 T 参数)

您可能还需要让您的 Node<T> 能够将 T 存储为 属性。