使用泛型和单向链表(错误 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
存储为 属性。
我的任务是使用单链表和泛型创建一个集合。为了创建一个单向链表,我做了一个特殊的 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
存储为 属性。