有关.net泛型通用函数一些特殊问题
本文导语: .net有了泛型后,不用再像object类型那样由于“拆箱”或“装箱”等操作带来性能上的损失了,它有一个让人振奋的功能就是:可以在编译语法检测阶段即可实时检测出传入或传出类型是否符合特定条件。 不过,....
.net有了泛型后,不用再像object类型那样由于“拆箱”或“装箱”等操作带来性能上的损失了,它有一个让人振奋的功能就是:可以在编译语法检测阶段即可实时检测出传入或传出类型是否符合特定条件。
不过,.net泛型自身类型的不确定,也会引发一些问题:无法进行运算符重载。
假如要写一个函数(一个通用的选择排序算法,使用泛型T),应该如何编写?
c#实现的简单代码:
//从小到大,改进型选择排序算法
public static void Sort(T[] array)
{
bool flag = false; //标记是否已经排序
for(int i=0;i'无法作用于T”一类的提示。
为何如此呢?
我们知道,凡是可以进行大于、小于比较的类型肯定都定义了运算符重载。一般类必须为此定义方可进行比较,不然大于号或者小于号(或者其它运算符)无法知道如何比较而发生错误。那么泛型因为事先都不知道什么类型?编译器检查器自然无法推断你运行时动态传入的这个类型一定保证是实现了运算符重载,严格语法检查情况下就自然报错。
怎么办呢?强制规定泛型T必须实现比较器(强制T必须实现IComparable,或者类似接口)。
public static void Sort(T[] array)where T:IComparable
{
bool flag = false; //标记是否已经排序
for(int i=0;i