具有约束IEqualityComparer的泛型类

时间:2014-04-28 02:37:38

标签: c# generic-collections

我对C#中的Generic类很新。我试图创建一个并遇到编译器错误,我不知道如何解决它。

基本上,我有一个实现ICollection的类G

public class G<T> : ICollection<T> where T : IEqualityComparer
{
    private ArrayList _members = new ArrayList();

    public void Add(T item)
    {
        throw new NotImplementedException();
    }

    public void Clear()
    {
        throw new NotImplementedException();
    }

    public bool Contains(T item)
    {
        throw new NotImplementedException();
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        throw new NotImplementedException();
    }

    public int Count
    {
        get { throw new NotImplementedException(); }
    }

    public bool IsReadOnly
    {
        get { throw new NotImplementedException(); }
    }

    public bool Remove(T item)
    {
        throw new NotImplementedException();
    }

    public IEnumerator<T> GetEnumerator()
    {
        foreach (var item in _members)
        {
            yield return (T)item;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

我希望能够在G中的G和Find项目中进行比较,所以我已经设置了一个T必须实现IEqualityComparer的约束。然后,我有一个名为IntegerClass的实际类,它实现IEqualityComparer,如下所示。到目前为止,这么好,没有编译器错误。

public class IntegerClass : IEqualityComparer<int>
{
    public bool Equals(int x, int y)
    {
        throw new NotImplementedException();
    }

    public int GetHashCode(int obj)
    {
        throw new NotImplementedException();
    }
}

但是,当我尝试在上面创建G的实例时。我遇到了编译错误。

class Program
{
    static void Main(string[] args)
    {
        G<IntegerClass> i = new G<IntegerClass>();
    }
}

错误是:

The type 'TestGeneric.IntegerClass' cannot be used as type parameter 'T' in the generic type or method 'TestGeneric.G<T>'. 
There is no implicit reference conversion from 'TestGeneric.IntegerClass' to 'System.Collections.IEqualityComparer'

有人可以找出我忽略的内容吗?我为什么需要转换?我所做的就是用实现IEqualityComparer接口的IntegerClass替换类T.我该怎么办?我是这个通用的东西的新手,但发现它非常有用。我认为如果我理解正确的话可能会非常有用。请帮忙。

更新: 基于一些建议,我看到了什么问题,我更新了代码如下:

   public class IntegerClass :  IEqualityComparer
    {
        public bool Equals(object x, object y)
        {
            throw new NotImplementedException();
        }
    public int GetHashCode(object obj)
    {
        throw new NotImplementedException();
    }
}
public class G<T> : ICollection<T> where T : IEqualityComparer
{
    private ArrayList _members = new ArrayList();

    public void Add(T item)
    {
        throw new NotImplementedException();
    }

    public void Clear()
    {
        throw new NotImplementedException();
    }

    public bool Contains(T item)
    {
        throw new NotImplementedException();
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        throw new NotImplementedException();
    }

    public int Count
    {
        get { throw new NotImplementedException(); }
    }

    public bool IsReadOnly
    {
        get { throw new NotImplementedException(); }
    }

    public bool Remove(T item)
    {
        throw new NotImplementedException();
    }

    public IEnumerator<T> GetEnumerator()
    {
        foreach (var item in _members)
        {
            yield return (T)item;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

我认为它可能有效,但我收到了以下警告:

'TestGeneric.IntegerClass.Equals(object,object)'隐藏继承的成员'object.Equals(object,object)'。如果想要隐藏,请使用new关键字。

我知道对象有一个Equals方法,但警告没有意义。它是否应该说如果隐藏不是打算使用新关键字?

3 个答案:

答案 0 :(得分:3)

您的约束是指非通用System.Collections.IEqualityComparer接口,它与IEqualityComparer<T>不同。
您可以通过在约束中指定泛型类型来修复该错误。


但是,这不是你想要的; IEqualityComparer是一个比较其他事物的类。

您想要where T : IEquatable<T>

答案 1 :(得分:0)

更改您的IntegerClass,如下所示。

public class IntegerClass : IEqualityComparer<IntegerClass>
{
    public bool Equals(IntegerClass IC1, IntegerClass IC2)
    {
        throw new NotImplementedException();
    }

    public int GetHashCode(IntegerClass obj)
    {
        throw new NotImplementedException();
    }
}

答案 2 :(得分:0)

或者你可以诉诸于Objects具有相等功能的事实。 因此,这将起作用

    public interface IMyComparer
    {
        object Comparer { get; }
    }

    public class IntegerClass : IMyComparer, IEqualityComparer<int>
    {

        public object Comparer { get { return this; } }

        public bool Equals(int x, int y)
        {
            throw new NotImplementedException();

        }

        public int GetHashCode(int obj)
        {
            throw new NotImplementedException();
        }
   }
   public class G<T> : ICollection<T> where T : IMyComparer
   {
     Your implementations
   }

希望它有所帮助。