![](/img/trans.png)
[英]Not correct explicit method is called within generics and inheritance
[英]Generics and inheritance - method args
我用方法Add寫了數據結構LinkedList:
public 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);
我得到錯誤,方法添加“有一些無效的參數”。 如何解決這個問題? 謝謝您的幫助。
當你寫作
LinkedList<ElementLong>
您將T
定義為ElementLong
。 Add
方法需要一個Element<T>
,在本例中是
Element<ElementLong>
如果您希望列表只允許long
s,您可以使用:
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);
您應該將鏈表的泛型類型參數保持為實際類型:
LinkedList<long> test = new LinkedList<long>();
ElementLong elem1 = new ElementLong();
test.Add(elem1);
由於ElementLong
實際上是一個Element<long>
這將起作用。
如果你仍然得到它, LinkedList<ElementLong>
將期望Element<ElementLong>
作為參數:)
就這個界面而言:
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類是否應該是可訪問的(公共)。
其他人提到您的問題是您的泛型類型是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>
接口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.