泛型约束的用途是什么?例如:其中T:IComparable

时间:2014-07-14 07:55:03

标签: c# generics

可能希望,你们都很好,我对Constraint有些困惑,我仍然没有得到这个,使用约束有什么好处?

明天我明白了Generics。这是使用这种方法的一个很棒的功能,我的意思是最简单的使用方法,不需要一次又一次地使用不同的数据类型,只需用任何类型的数据类型调用它,

特别是我确实理解了这些例子的所有条款,

using System;

class Test<T>
{
    private T _value;

    public Test(T t)
    {
        this._value = t;
    }

    public void print()
    {
        Console.WriteLine("This is {0}", this._value);
    }
}

class MyProgram
{
    private static void Main(string[] args)
    {
        Test<int> test = new Test<int>(145);
        test.print();

        Test<string> test2 = new Test<string>("My name is ghost!");
        test2.print();

        Test<double> test3 = new Test<double>(458.5456);
        test3.print();
    }
}

但是当我深入Generics constraints时,我没有得到What it is used for! 你能用最简单的例子告诉我,使用这个有什么好处?

当我看到这个时,我很困惑:

public class MyGenericClass<T> where T:IComparable { }

什么是where T:IComparable{}? IComparable的定义是什么?

感谢〜

4 个答案:

答案 0 :(得分:6)

没有约束,T的最低常见类型是object。如果你想用一组常见的类型做一些共同点,那就太没用了。通过允许约束,您可以将最低常见类型“向上拖动”到您指定为约束的类型。如果键入不符合约束条件,它也会阻止您使用通用代码。

例如,

IComparable会让您的代码调用CompareTo

还有一些其他可用的内置约束与您的类型层次结构无关:

  • where T : class
  • where T : struct
  • where T : new()

您可以通过reviewing the documentation了解这些含义。

<小时/> IComparable只是BCL中可用的.NET框架接口; documentation here

  

定义一个值的通用类型特定比较方法   type或class implements来对其实例进行排序或排序。

正如Jeppe Stig Nielsen所提到的,你应该在你的通用约束上使用通用版IComparableIComparable<T>,以获得各种其他好处。

答案 1 :(得分:0)

约束很有用,因为您需要使用通用类型来表达某些特定行为,例如为您的实例实现接口。这是您的案例的先决条件,因为实现此行为的tyope具有一些特定的特征,这些特征将在您声明的泛型类中使用。

具体而言,IComparable

  

定义一个通用的特定于类型的比较方法,值类型或类实现它以对其实例进行排序或排序。

实现此接口的所有类型都表达了名为CompareTo的方法,其中

  

将当前实例与同一类型的另一个对象进行比较,并返回一个整数,该整数指示当前实例是否在排序顺序中与其他对象相同的位置之前,之后或出现。

该方法的签名是:

int CompareTo(Object obj)

并返回

  • 小于零,此实例在排序顺序中位于obj之前。
  • ,此实例与obj在排序顺序中的位置相同。
  • 大于零,此实例遵循排序顺序中的obj。

话虽如此,在您的情况下,您定义的泛型类型必须实现此行为,这是必需的,因为在您的类型定义中,您将需要此类型CompareTo的方法,它由类型实现实现接口IComparable

在另一种情况下,您可能需要您的类型只有class。然后你的泛型类的定义是:

public class MyGenericClass<T> where T: class

另一方面,在另一种情况下,您可能需要您的类型只有struct。然后你的类型的定义是:

public class MyGenericClass<T> where T: struct

答案 2 :(得分:0)

当使用没有任何约束的简单泛型时,您可以假设泛型类型。

考虑下面的代码:

class Test<T>
{
    public void Stuff()
    {
        T t;
        t = new T(); // COMPILE TIME ERROR - type T may not have a parameterless constructor
    }
}

有约束:

class Test<T> where T : new()
{
    public void Stuff()
    {
        T t;
        t = new T(); // IT IS OK - the type T must have parameterless constructor.
    }
}

考虑助手类:

class A 
{
   public A(int a)
   {
   }
}

当您尝试编译var test = new Test<A>();时,您将收到编译时错误(当然,我们正在讨论带有约束的测试)因为类型A没有&#39; t包含无参数构造函数。

答案 3 :(得分:0)

使用时

public class MyGenericClass<T> where T:IComparable { }

然后T必须实现接口IC Comparable! 当你想要实现一个排序算法时,这对于exaple非常有用!当然你也可以在其他地方使用其他接口!