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