C# 什么';什么是泛型约束的使用?例如:其中T:i可比较

C# 什么';什么是泛型约束的使用?例如:其中T:i可比较,c#,generics,C#,Generics,希望你们都很好,我对约束有些困惑,我还是不明白,使用约束有什么好处 明天我确实了解了泛型。使用这个方法是一个很棒的特性,我的意思是使用这个方法最简单,无需使用不同的数据类型反复使用这个方法,只需使用任何类型的数据类型调用它 特别是我通过这些例子理解了所有这些术语 using System; class Test<T> { private T _value; public Test(T t) { this._value = t; }

希望你们都很好,我对约束有些困惑,我还是不明白,使用约束有什么好处

明天我确实了解了
泛型
。使用这个方法是一个很棒的特性,我的意思是使用这个方法最简单,无需使用不同的数据类型反复使用这个方法,只需使用任何类型的数据类型调用它

特别是我通过这些例子理解了所有这些术语

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();
    }
}
使用系统;
课堂测试
{
私人T_值;
公共测试(T)
{
这是._值=t;
}
公开作废印刷品()
{
WriteLine(“这是{0}”,这是.\u值);
}
}
类MyProgram
{
私有静态void Main(字符串[]args)
{
测试=新测试(145);
test.print();
Test test2=新测试(“我的名字是ghost!”);
test2.print();
测试3=新测试(458.5456);
test3.print();
}
}
但是当我深入了解
泛型约束时,我不明白它的用途
你能用最简单的例子告诉我,使用这个有什么好处吗

当我看到这一点时,我感到困惑:

公共类MyGenericClass其中T:IComparable{}

什么是
,其中T:i可比较{}
??什么是IComparable


感谢~

没有限制,最常见的
T
类型是
object
。如果你想用一组普通的类型做一些普通的事情,那就没什么用了。通过允许约束,可以将最低的公共类型“向上拖动”到指定为约束的类型。如果您键入的内容不符合约束条件,它还会阻止您使用泛型代码

例如,
IComparable
将允许您的代码调用
进行比较

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

  • 其中T:class
  • 其中T:struct
  • 其中T:new()
你可以找出这些是什么意思。
IComparable
只是BCL中可用的.NET framework接口:

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


正如Jeppe Stig Nielsen所提到的,您应该在通用约束上使用
IComparable
,即
IComparable
,以获得各种其他好处。

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

具体来说,
i可比较

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

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

将当前实例与相同类型的另一个对象进行比较,并返回一个整数,该整数指示当前实例是在排序顺序中位于另一个对象之前、之后还是发生在同一位置

该方法的签名为:

int CompareTo(Object obj)
返回

  • 小于零时,此实例按排序顺序位于obj之前
  • 零,则此实例与obj发生在排序顺序相同的位置
  • 大于零时,此实例按排序顺序跟随obj
也就是说,在您的情况下,您定义的泛型类型必须实现此行为,这是必需的,因为在您的类型定义中,您将需要此方法,
CompareTo
,它由实现接口的类型实现
IComparable

在另一种情况下,您可能需要您的类型仅为
。那么泛型类的定义将是:

public class MyGenericClass<T> where T: class
public class MyGenericClass<T> where T: struct

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

考虑以下代码:

class Test<T>
{
    public void Stuff()
    {
        T t;
        t = new T(); // COMPILE TIME ERROR - type T may not have a parameterless constructor
    }
}
何时尝试编译
var test=new test()
您将得到编译时错误(当然我们讨论的是约束测试),因为类型
A
不包含无参数构造函数。

当您使用

public class MyGenericClass<T> where T:IComparable { }
公共类MyGenericClass其中T:IComparable{}
然后T必须实现接口IComparable!
例如,当您需要实现排序算法时,这可能非常有用!当然,您也可以使用其他接口与where

基本上意味着该类实现IComparable接口的位置实际上应该使用
where T:IComparable
而不是
where T:IComparable
,因为后者将导致一些不必要的类型检查,如果
T
是(可能是)值类型,则(更糟)装箱,例如,一个
结构
或一个
枚举
。它实际上归结为同一个问题,“为什么要使用
IComparable x
而不是
对象x
?”(在这两种情况下
x
可以做什么?),其中T:class对于在实体框架中使用泛型很重要,例如,
T的最低常见类型是object
,但是这里我的
T
定义了数据类型,是的,我们可以在这里使用
testtest1=newtest
。这就是你的意思!但是
如果你想用一组常见的类型做一些常见的事情,那么它是非常无用的。
但是它是如何非常无用的呢。。我还是不明白你的意思@
T
的reenakumar实例将解析为您指定用于关闭泛型的类型,但当您尝试使用它时,您将只得到class A { public A(int a) { } }
public class MyGenericClass<T> where T:IComparable { }