我对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方法,但警告没有意义。它是否应该说如果隐藏不是打算使用新关键字?
答案 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
}
希望它有所帮助。