2011-05-29 79 views
1

我有这样的通用类.NET泛型拳击编译错误

public class BinaryTreeNode<T> where T : IComparable 
{ 
    public BinaryTreeNode(T value) 
    { 
     Value = value; 
    } 

    public T Value; 
    public BinaryTreeNode<T> Right; 
    public BinaryTreeNode<T> Left; 
    public BinaryTreeNode<T> Parent; 
} 

和测试类

public class BinarySearchTree<T> where T : IComparable 
    { 
    BinaryTreeNode<T> _root = null; 
    ... 
    } 

和静态测试方法

public static class TestBST 
    { 
    public static BinarySearchTree<T> GetABuiltBST<T>(List<T> valuesToAdd) 
    { 
     BinarySearchTree<T> tree = new BinarySearchTree<T>(); 

     foreach (T i in valuesToAdd) 
     { 
      tree.Add(i); 
     } 

     return tree; 
    } 
    } 

现在,我得到这个编译此静态方法中的错误

错误1类型'T'不能用作泛型类型或方法'DsLib.BinarySearchTree'中的类型参数'T'。没有从'T'到'System.IComparable'的装箱转换或类型参数转换

这里发生了什么问题?以及何时添加通用方法名称后(GetABuiltBST * < T> *)?我甚至需要吗?为了摆脱类似的错误,我在之前将方法名称放在后面,我没有详细介绍那个时间。

如果我删除,我得到错误“的类型或命名空间名称‘T’找不到(是否缺少using指令或程序集引用?)”

顺便说一句,如果我不限制ŧ与IComparable然后一切工作得很好。

回答

3
public static BinarySearchTree<T> GetABuiltBST<T>(List<T> valuesToAdd) 

需要一个通用的限制这足够严格,以满足:即你需要添加这样的约束

public class BinaryTreeNode<T> where T : IComparable 

public static BinarySearchTree<T> GetABuiltBST<T>(List<T> valuesToAdd) 
    where T : IComparable 

作为一个旁注,是否有任何理由你为什么使用IComparable而不是IComparable<T>

而国际海事组织你根本就不应该在你的二叉树类上有这个约束。而是允许用户通过IComparer<T>。并且默认为Comparer<T>.Default,如果用户不提供一个,则其使用IComparable<T>

+0

我用IComparable 但这是编译错误。 (并且我在某处阅读共振),因为T应该实现IComparable并且不能实现ICOmparable 本身。 – 2011-05-29 21:10:22

+0

我有一个BinarySearchTree类里面的方法,它是public static void PrintValueStatusInBST(BinarySearchTree tree,T value)。在这里,我不需要约束,甚至没有方法名称后的(如PrintValueStatusInBST )为什么? – 2011-05-29 21:11:00

+0

在这种特定情况下,您需要将其实现为IComparable >'BinarySearchTree '的'T'和'IComparable '的'T'不应该是相同的。 – CodesInChaos 2011-05-29 21:11:44

2

简单地改变方法:

public static BinarySearchTree<T> GetABuiltBST<T>(List<T> valuesToAdd) where T : IComparable 
+0

我是否需要在每个使用T的方法上添加相同的约束?没有任何其他解决方案。和1个问题,我问方法名称后何时使用? – 2011-05-29 21:07:33

+1

您需要将至少作为限制性约束添加到替换到'BinaryTreeNode '中的每个通用参数。如果没有这个要求,一般的约束条件都是无用的。 – CodesInChaos 2011-05-29 21:09:33