我正在创建一个通用类来保存小部件,但我在实现 contains 方法时遇到了问题:
public class WidgetBox<A,B,C>
{
public bool ContainsB(B b)
{
// Iterating thru a collection of B's
if( b == iteratorB ) // Compiler error.
...
}
}
错误:运算符“==”不能应用于“V”和“V”类型的操作数
如果我不能比较类型,我该如何实现包含?字典、列表和所有其他通用容器是如何做到的??
最佳答案
这里有几个选项
首先是使用Object.Equals
:
if(b.Equals(iteratorB)) {
// do stuff
}
小心使用这个选项;如果B
不会覆盖 Object.Equals
那么当 B
时默认比较是引用相等B
时是引用类型和值相等是一个值类型。这可能不是您正在寻求的行为,这就是为什么在没有其他信息的情况下我会考虑接下来两个选项之一的原因。
第二个是添加一个约束 B
是IComparable
:
public class WidgetBox<A, B, C> where B : IComparable
这样
if(b.CompareTo(iteratorB) == 0) {
// do stuff
}
第三个是要求 IEqualityComparer<B>
传递给 WidgetBox
的构造函数
public class WidgetBox<A, B, C> {
IEqualityComparer<B> _comparer;
public WidgetBox(IEqualityComparer<B> comparer) {
_comparer = comparer;
}
// details elided
}
然后:
if(_comparer.Equals(b, iteratorB)) {
// do stuff
}
使用最后一个选项,您可以提供默认为 EqualityComparer<T>.Default
的重载:
public WidgetBox() : this(EqualityComparer<T>.Default) { }
关于c# - 无法比较通用值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2238651/