簡體   English   中英

返回通用類型的節點列表 C#

[英]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是什么。 很明顯你不能假設Tint

選項 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM