【发布时间】:2011-01-09 13:41:21
【问题描述】:
更新* 很抱歉......我的示例代码包含一个错误,导致很多我不明白的答案。 而不是
Console.WriteLine("3. this.Equals " + (go1.Equals(go2)));
我想写
Console.WriteLine("3. this.Equals " + (go1.Equals(sb2)));
我试图弄清楚如何才能成功确定两个泛型类型值是否彼此相等。基于 Mark Byers 对 this question 的回答,我想我可以使用 value.Equals(),其中 value 是泛型类型。
我的实际问题是在 LinkedList 实现中,但可以通过这个更简单的示例来说明问题。
class GenericOjbect<T> {
public T Value { get; private set; }
public GenericOjbect(T value) {
Value = value;
}
public bool Equals(T value) {
return (Value.Equals(value));
}
}
现在我定义一个包含new StringBuilder("StackOverflow") 的GenericObject<StringBuilder> 实例。如果我在这个 GenericObject 实例上调用Equals(new StringBuilder("StackOverflow"),我希望得到true,但我得到false。
显示此的示例程序:
using System;
using System.Text;
class Program
{
static void Main()
{
var sb1 = new StringBuilder("StackOverflow");
var sb2 = new StringBuilder("StackOverflow");
Console.WriteLine("StringBuilder compare");
Console.WriteLine("1. == " + (sb1 == sb2));
Console.WriteLine("2. Object.Equals " + (Object.Equals(sb1, sb2)));
Console.WriteLine("3. this.Equals " + (sb1.Equals(sb2)));
var go1 = new GenericOjbect<StringBuilder>(sb1);
var go2 = new GenericOjbect<StringBuilder>(sb2);
Console.WriteLine("\nGenericObject compare");
Console.WriteLine("1. == " + (go1 == go2));
Console.WriteLine("2. Object.Equals " + (Object.Equals(go1, sb2)));
Console.WriteLine("3. this.Equals " + (go1.Equals(sb2)));
Console.WriteLine("4. Value.Equals " + (go1.Value.Equals(sb2.Value)));
}
}
对于比较两个StringBuilder对象的三种方法,只有StringBuilder.Equals实例方法(第三行)返回true。这是我所期望的。但是在比较 GenericObject 对象时,它的 Equals() 方法(第三行)返回 false。有趣的是,第四个比较方法确实返回true。我认为第三和第四个比较实际上是在做同样的事情。
我会期待true。因为在 GenericObject 类的 Equals() 方法中,value 和 Value 都是 T 类型,在这种情况下是 StringBuilder。根据 Mark Byers 在 this question 中的回答,我预计 Value.Equals() 方法将使用 StringBuilder 的 Equals() 方法。正如我所展示的,StringBuilder 的 Equal() 方法确实返回 true。
我试过了
public bool Equals(T value) {
return EqualityComparer<T>.Default.Equals(Value, value);
}
但这也返回 false。
所以,这里有两个问题:
- 为什么代码没有返回
true? - 如何实现
Equals方法,使其确实返回true?
【问题讨论】:
标签: c# generics comparison