what are you using? whidbey? tryclass Set<T> where T : IComparable
{...
          if (x.CompareTo(A[i]) == 0)see
http://msdn.microsoft.com/msdnmag/issues/03/10/NET/default.aspx

解决方案 »

  1.   

    这样的,在C#中间,泛型的使用受到很大的限制,也就是在Set<T>这样的泛型类中,T类型的对象是不能调用任何方法的,除非你使用Constraints来显式告诉编译器T类型的实例支持哪些方法的调用,比如要对T类型的对象进行比较,你必须显示的申明所有Set<T>可容纳的类型都是继承自IComparable接口的,这样编译器就知道T类型的实例可以使用CompareTo方法来进行比较,所以要把Set<T>的申明改为:class Set<T> where T:IComparable
    {
      ...
    }然后把if (x == A[i])改为 if ( x.CompareTo(A[i]) )然而这样有一个限制就是,没有实现IComparable接口的类,将不能实例化Set<T>类型。
      

  2.   

    应该是 if (x.CompareTo(A[i]) == 0) -_-b saucer也出现了,膜拜一下 :)
      

  3.   

    也可以参考一下这里:ms-help://MS.Windows.NETFramework2.0.en/csref/html/vclrfgenericsinc.htm
      

  4.   

    使用约束(思归给你的语法)可以让泛型类型进行比较,但你的程序会有很大的限制,那些没有实现IComparable的类型将无法使用你这个集合类。
    所以最佳的做法是,改变判断的语法:
    if (x ==A[i])
    改为:
    if (object.Equals(x, A[i]))
    就行了。
      

  5.   

    我的方法无需where T : IComparable
      

  6.   

    对泛型类型的约束越少越好,比如上面两位建议你约束IComparable,而你值需要判断等值,IComparable不仅仅能判断等值,还能判断大于和小于,这不是你需要,因此就不应该采用IComparable。使用约束一定要自己斟酌,只要约束类型有一个功能是你不需要的,那么就不要用该类型进行约束!不科学的约束会大大束缚泛型的应用范围。
      

  7.   

    呵呵。Ninputer在CSDN上都是星级用户啦,应该看的出来我是谁吧。
    用Object.Equals还是有问题啊,Object.Equals默认的是对引用进行判等,所以要想得到楼主的效果的话,T还是要重写Equals方法,然后调用T.Equals。
    另外,实现IComparable的类要求重写Equals方法~~~~~~
      

  8.   

    同意楼上的,用Object.Equals确实也有很大的问题,还是老老实实用Constraints吧。这个该死的Constraints,恨死我了!Ninputer是在我的blog上留言的那位? 原来是csdn上的星级用户啊,失敬 :p
      

  9.   

    我同意 Ninputer 的做法.
    除非设计者有问题,凡是实现了IComparable的类应该重写了Equals的.
    相反的,像我这样的懒人,重写了Equals的时候不一定会实现IComparable的.
      

  10.   

    这个似乎有可以辩论的地方。不否认实现了IComparable接口的类大多重写了Equals,然而,对于没有重写了Equals的那些类,以上的这个Set<T>就会表现出一些未知的行为来。尤其对于Set<T>的用户来说,他们并不知道Set<T>内部用了Object.Equals方法,并且使用Set<T>的类型必须重写Equals方法,不然Set<T>就不能正常工作。不否认不使用约束确实使得Set<T>能够适用于任意类型,然而Set<T>事实上只对其中一部分才能正常工作,对于那些没有重写Equals的的类型,object.Equals(x, A[i]))总是返回false的,这显然不是if (x == A[i]) 要做的事情,这明显的就成为了一个大的BUG。所以还是老老实实用constraints比较好。
      

  11.   

    大部分.net的内部类都很好地重写了Equals,特别是ValueType。比如IntPtr,根本就没有实现IComparable,但是用Equals能够进行很好的等值比较。
    搂主这个集合,明显是希望任何对象都能放入,包括IntPtr甚至Exception的实例。而IComparable表示的可比较大小的类型,放入集合并不需要比较大小对不对。我的意思是说约束一定要按照设计的需要进行,没有对IComparable的需要就不要用这个约束。
    其实Object.Equals对引用类型来讲都是进行引用等值判断的,这对于Set的工作来说也没什么不正确的,对不对。有时候重写了Equals反而会导致不可预期的效果呢。
      

  12.   

    .NET的泛型竟然不能对值类型进行约束!我今天试验
    [C#]
    public class Test<T> where T : System.ValueType[VB]
    Public Class Test(Of T As ValueType)都是不行的。哎,本来我期望可以进行一些有意义的设计的。