接口中有这样的代码 System.Collections.Generic.List<IEnumerable<T>> DoCompare<T>(IEnumerable<T> QusetArry, IEnumerable<T> TragetArry)
where T : IEquatable<char>, IEquatable<int>;我知道这个代码是错误的,因为char没有到int的装箱转换这个代码想实现的是以下约束:
T只能要么是实现IEquatable<char>的类型,或者要么是实现IEquatable<int>接口的类型退一步说,能实现以下的定义也可以:
T只能要么是char型,要么是int型这样的约束该如何定义?谢谢大家
where T : IEquatable<char>, IEquatable<int>;我知道这个代码是错误的,因为char没有到int的装箱转换这个代码想实现的是以下约束:
T只能要么是实现IEquatable<char>的类型,或者要么是实现IEquatable<int>接口的类型退一步说,能实现以下的定义也可以:
T只能要么是char型,要么是int型这样的约束该如何定义?谢谢大家
where T : IEquatable<char>;
List<IEnumerable<T>> DoCompare<T>(IEnumerable<T> QusetArry, IEnumerable<T> TragetArry)
where T : IEquatable<int>;这样是不行的,而且如果重载这个函数,模块设计就要改关键是,我需要这样的思路:在泛型约束里出现互斥条件,如何让他们以或的方式共存
{
List<IEnumerable<T>> DoCompare<T>(IEnumerable<T> QusetArry, IEnumerable<T> TragetArry)
where T : T符合IEquatable<char> 或者 T符合IEquatable<int> 或者 T符合Equatable<......>
}
然后是业务类//业务类有很多...
class 业务A : I接口A
{
//业务A的比较方法
List<IEnumerable<T>> DoCompare(IEnumerable<T> QusetArry, IEnumerable<T> TragetArry)
where T : T符合IEquatable<char> 或者 T符合IEquatable<int> 或者 T符合Equatable<......>
{
//dosomething
QusetArry.ElementAt(X).Equals(TragetArry.ElementAt(X))
//dosomething
}
}
然后入口工厂.CreateComparer("条件").DoCompare(List<某类型T>,List<某类型T>)
这个命题的关键在:
1。这个模块写好以后,我不知道调用的时候<某类型T>具体会是什么类型,但是我大概知道他可能是string,int,char...范围大概10来个,所以我需要把所有的IEquatable<T>定义到约束里...
2。传过来的DoCompare(IEnumerable<T> QusetArry, IEnumerable<T> TragetArry)可能会非常非常大,所以假如T是值类型,我不希望在DoCompare方法里执行装箱拆箱操作,所以IEnumerable<T>是必须的...====================================
其实这个问题我自己已经有别的解决方案了,简单说就是改用IComparable这个非泛型对比器List<IEnumerable<T>> DoCompare(IEnumerable<T> QusetArry, IEnumerable<T> TragetArry)
where T : IComparable
{
//然后QusetArry.ElementAt(x).CompareTo(TragetArry.ElementAt(y));
//....一些其他处理
}
但是这个方法显然有很严重的隐患......====================================
我确实对泛型的本质不太了解,所以才会产生之前的问题我们在定义泛型约束的时候是否能够给定互斥条件,并且让这些条件以"或"关系存在,这才是我发这个帖子的本质目的?
不知我是否把问题说明白了?
以上致谢
interface I接口A
{
List<IEnumerable<char>> DoCompare(IEnumerable<char> QusetArry, IEnumerable<char> TragetArry);
List<IEnumerable<int>> DoCompare(IEnumerable<int> QusetArry, IEnumerable<int> TragetArry);
}
这个方法可行,不过每个业务类都必须实现十余个重载的DoCompare方法
这样方案维护起来好麻烦!其实这里的一大问题是对T占位符的比较(QusetArry.equel(TragetArry))
因为不知道QusetArry会是什么类型,所以才不得不去约定IComparable或者IEquatable<T>这样的约束(偷懒)
其实这个问题很简单这个样子
interface I接口A
{
List<IEnumerable<T>> DoCompare(IEnumerable<T> QusetArry, IEnumerable<T> TragetArry)
where T : Equatable<T>;
}搞定..........囧居然去想什么互斥条件.........真是 囧囧囧囧
不过谢谢诸位了