Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的比较:运算符'<';无法应用于类型为';T';和';T';_C#_Generics - Fatal编程技术网

C#中的比较:运算符'<';无法应用于类型为';T';和';T';

C#中的比较:运算符'<';无法应用于类型为';T';和';T';,c#,generics,C#,Generics,我已经创建了一个二进制树节点类,然后为二进制树类创建了添加(T数据)方法 当我尝试比较对象的值时,编译器说: 运算符“研究如何使用来缩小T可以是的类型。这样,您就可以确保可以使用操作员对它们进行比较 目前,T可以是任何物体。例如,如果你有一个Car对象,编译器怎么知道说一辆车“小于”或“大于”另一辆车是什么意思?这就是您需要约束的原因。您应该添加一个约束,使T必须实现IComparable,然后使用该约束: public class BinaryTree<T> where T : I

我已经创建了一个
二进制树节点
类,然后为
二进制树
类创建了
添加(T数据)
方法

当我尝试比较对象的值时,编译器说:

运算符“研究如何使用来缩小T可以是的类型。这样,您就可以确保可以使用操作员对它们进行比较


目前,T可以是任何物体。例如,如果你有一个Car对象,编译器怎么知道说一辆车“小于”或“大于”另一辆车是什么意思?这就是您需要约束的原因。

您应该添加一个约束,使T必须实现
IComparable
,然后使用该约束:

public class BinaryTree<T> where T : IComparable<T>
{
    public void AddNode(T data)
    {
        BinaryTreeNode<T> node = new BinaryTreeNode<T>(data);
        BinaryTreeNode<T> temp = root;

        if (temp.Value.CompareTo(node.Value) < 0)
        ...
public class BinaryTree<T> where T : IComparable<T>
{
    private readonly IComparer<T> comparer;

    public BinaryTree(IComparer<T> comparer)
    {
        this.comparer = comparer;
        ...
    }

    public void AddNode(T data)
    {
        BinaryTreeNode<T> node = new BinaryTreeNode<T>(data);
        BinaryTreeNode<T> temp = root;

        if (comparer.Compare(temp.Value, node.Value) < 0)
公共类二进制树,其中T:IComparable
{
公共无效添加节点(T数据)
{
BinaryTreeNode=新的BinaryTreeNode(数据);
二元树节点温度=根;
如果(温度值比较到(节点值)<0)
...
另一种方法是传入一个
i比较程序
,然后使用:

public class BinaryTree<T> where T : IComparable<T>
{
    public void AddNode(T data)
    {
        BinaryTreeNode<T> node = new BinaryTreeNode<T>(data);
        BinaryTreeNode<T> temp = root;

        if (temp.Value.CompareTo(node.Value) < 0)
        ...
public class BinaryTree<T> where T : IComparable<T>
{
    private readonly IComparer<T> comparer;

    public BinaryTree(IComparer<T> comparer)
    {
        this.comparer = comparer;
        ...
    }

    public void AddNode(T data)
    {
        BinaryTreeNode<T> node = new BinaryTreeNode<T>(data);
        BinaryTreeNode<T> temp = root;

        if (comparer.Compare(temp.Value, node.Value) < 0)
公共类二进制树,其中T:IComparable
{
专用只读IComparer比较器;
公共二叉树(IComparer comparer)
{
this.comparer=比较器;
...
}
公共无效添加节点(T数据)
{
BinaryTreeNode=新的BinaryTreeNode(数据);
二元树节点温度=根;
if(比较器比较(温度值、节点值)<0)

这是最接近于保证“值的类型(int、string、char[]、MyClass、YourClass等)不支持“youreally have a class name”t的方法"太棒了。我应该在3hrs之前问一下:-)。你能补充一下如何为没有实现它的Ts实现IComparable吗。如果T本身没有实现
IComparable
,那么你可能想改用
IComparaer
方法-实现起来非常简单,你只需比较给定的值并返回一个负数即可数字、正数或0,具体取决于该比较。谢谢。您消除了无法比较它们的疑问。(+1)
public class MyData : IComparable<MyData>
{
    public int CompareTo(MyData other)
    {
         // return -1 if 'this' is smaller than other, 0 if equals, 1 otherwise
    }
}
if( temp.Value.CompareTo(node.Value) < 0 )