[英]Returning a List of Nodes that are Generic Types C#
我正在了解 generics,顯然有一些我不了解的基本知識。
我有一個節點 class 和一個 function,它們將填充節點的二叉樹並將該樹作為列表返回。 我希望節點的值具有通用數據類型,因此我將節點 class 制作成這樣:
class Node<T>
{
public T dataval;
public Node<T> left;
public Node<T> right;
public Node(T data)
{
this.dataval = data;
this.left = null;
this.right = null;
}
}
現在在創建 function 時,我正在嘗試使用原始類型(如 int 或 char)創建新節點。 這是我嘗試過的方法以及我遇到的錯誤。
public static List<Node<T>> createTree<T>(int length)
{
// a
// / \
// b c
// / \ \
//d e f
Node<T> a = new Node<T>(1); // cannot convert from 'int' to 'T'
Node<T> b = new Node<int>(2); // cannot implicitly convert 'Node<int>' to 'Node<T>'
Node<int> c = new Node<int>(3); // No error here, but error in return statement
var d = new Node<int>(4); // No errror here, but error in return statement
var e = new Node<int>(5);
var f = new Node<int>(6);
a.left = b;
a.right = c;
b.left = d;
b.right = e;
c.right = f;
return new List<Node<int>> { a, b, c, d, e, f}; // cannot convert from 'Node<int>' to 'Node<T>'
}
我認為我對 generics 的誤解始於創建這些新對象並使用原始數據類型實例化它們。 不確定這個過程出了什么問題。
您的通用createTree<T>
方法承諾創建一個樹,無論類型T
是什么。 很明顯你不能假設T
是int
。
選項 1 :使該方法專門創建一個int
樹:
將簽名更改為List<Node<int>> createTree(int length)
並在您現在擁有Node<T>
的任何地方使用Node<int>
> 。
選項 2 :從外部傳遞值
如果你想保持方法的通用性,你需要從調用者那里提供正確類型的值。
這可以以類型T
的附加參數的形式完成,例如List<Node<T>> createTree<T>(T aval, T bval, T cval, T eval, T fval)
或List<Node<T>> createTree<T>(T[] values)
或者工廠方法的形式List<Node<T>> createTree<T>(Func<T> valueFactory)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.