我用方法Add:
编写了数据结构LinkedListpublic class LinkedList<T>
{
private Element<T> first;
private Element<T> last;
public bool Add(Element<T> element)
{
...
我也定义了三个类:
public class Element<T> : IDisposable
public class ElementString : Element<string>, ICloneable
public class ElementLong : Element<long>, ICloneable
当我想在main方法中做这样的事情时:
LinkedList<ElementLong> test = new LinkedList<ElementLong>();
ElementLong elem1 = new ElementLong();
test.Add(elem1);
我得到方法添加“有一些无效参数”的错误。 如何解决这个问题?谢谢你的帮助。
答案 0 :(得分:4)
写作时
LinkedList<ElementLong>
您将T
定义为ElementLong
。 Add
方法需要Element<T>
,在本例中为
Element<ElementLong>
如果您希望列表仅允许long
,则可以使用:
LinkedList<long> test = new LinkedList<long>();
ElementLong elem1 = new ElementLong();
test.Add(elem1);
此外,可能不需要元素派生类,您可以直接使用基类:
var test = new LinkedList<long>();
var elem1 = new Element<long>();
test.Add(elem1);
答案 1 :(得分:1)
您应该将链表的泛型类型参数保留为实际类型:
LinkedList<long> test = new LinkedList<long>();
ElementLong elem1 = new ElementLong();
test.Add(elem1);
由于ElementLong
实际上是Element<long>
,因此可以使用。
如果您仍然可以获得LinkedList<ElementLong>
Element<ElementLong>
作为参数,那么这就是
答案 2 :(得分:0)
就这个界面而言:
LinkedList<ElementLong> test = new LinkedList<ElementLong>();
可能与此相同:
LinkedList<Element<long>> test = new LinkedList<Element<long>>();
类型参数T
等于Element<long>>
。这意味着您的add
方法实际上有一个签名:
public bool Add(Element<Element<long>> element)
但您提供的参数类型为Element<long>
,而不是Element<Element<long>>
。
您应该声明列表的泛型类型T等于long
,这是列表中要保留的元素类型。
我怀疑Element类是否应该是可访问的(公共)。
答案 3 :(得分:0)
其他人提到您的问题是您的通用类型为ElementLong
,因此Add
方法需要Element<ElementLong>
的值。但我还要说,您应该考虑更改Add
方法的签名,使其值为T
。
public class LinkedList<T>
{
private Element<T> first;
private Element<T> last;
public bool Add(T value)
{
...
LinkedList<long> test = new LinkedList<long>();
test.Add(0);
这更符合其他通用集合的工作原理。您也可以考虑实施IList<T>
接口。