Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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#中实现泛型方法_C#_Generics - Fatal编程技术网

如何在具有多个约束的C#中实现泛型方法

如何在具有多个约束的C#中实现泛型方法,c#,generics,C#,Generics,我想写一个通用方法: void Foo<T>(IList<T> list) void Foo(IList列表) 在这个方法中,我想通过使用操作符

我想写一个通用方法:

void Foo<T>(IList<T> list)
void Foo(IList列表)
在这个方法中,我想通过使用操作符 这可能吗?如果不是,我想这意味着C#泛型的使用非常有限

这可能吗?如果不是,我想这意味着C#泛型的使用非常有限

即使不可能,泛型也可以在许多情况下使用

然而,考虑到所有的原语类型都实现了
IComparable
,这是非常简单的

void Foo(IList列表),其中T:i可比较
{
tx=。。。;
T y=。。。;
如果(x.与(y)相比<0)
{
...
}
}
请注意,这不会引入装箱操作。我希望用于基本类型的JITted代码最终具有与使用
硬编码非常相似的性能


现在这是一个稍微特殊的情况,因为有一个大致相当于这些操作符的接口。不容易的是使用算术运算符(
+
-
等)。请参阅下面的一些方法。

我的意思是:在C++中,它是由编译器来检查在实例化中调用是否有效。但是C#有更高的要求,因此泛型的使用范围很窄。你说“窄”,我说“在我想使用泛型的绝大多数情况下绝对好。”@Jon Skeet,真的“绝对好”,即使你需要在泛型方法中调用运算符+?(是的,我刚才读了你的另一篇文章)。IMO,C#至少需要一些关于泛型的合同规范,比如“T需要运算符+重载”或“T需要有这样的签名方法”。在我想使用泛型的绝大多数情况下,这绝对是好的,因为在绝大多数情况下,我都不想调用operator+——就这么简单。你说C“需要”一些合同规范——你可能喜欢它(我也可以),但这和“需要”不一样。谢谢,乔恩Skest.你回答了我的问题,并确认C仿泛型不像C++模板那么灵活和强大。@光泽:它们不一样,也不一定是相同的。每种方法都有好处,并且每种方法都适合其所属语言的设计。
void Foo<T>(IList<T> list) where T : IComparable<T>
{
    T x = ...;
    T y = ...;
    if (x.CompareTo(y) < 0)
    {
        ...
    }
}