Update*我很抱歉...我的示例代码包含一个错误,导致很多我不理解的答案。
代替
Console.WriteLine("3. this.Equals " + (go1.Equals(go2)));
我本来想写
Console.WriteLine("3. this.Equals " + (go1.Equals(sb2)));
我试图弄清楚如何成功确定两个泛型类型值是否彼此相等。基于马克·拜尔斯的回答这个问题 https://stackoverflow.com/questions/3470145/two-net-objects-that-are-equal-dont-say-they-are我想我可以使用value.Equals()
其中 value 是泛型类型。
我的实际问题是在链接列表实现中,但问题可以通过这个简单的示例来显示。
class GenericOjbect<T> {
public T Value { get; private set; }
public GenericOjbect(T value) {
Value = value;
}
public bool Equals(T value) {
return (Value.Equals(value));
}
}
现在我定义一个实例GenericObject<StringBuilder>
含有new StringBuilder("StackOverflow")
。我希望得到true
如果我打电话Equals(new StringBuilder("StackOverflow")
在此 GenericObject 实例上,但我得到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
。有趣的是,第四种比较方法does return true
。我认为第三个和第四个比较实际上在做同样的事情。
我本以为true
。因为在GenericObject类的Equals()方法中,两者value
and Value
属于类型T
在本例中是一个StringBuilder
。基于马克·拜尔斯 (Mark Byers) 的回答这个问题 https://stackoverflow.com/questions/3470145/two-net-objects-that-are-equal-dont-say-they-are,我本来期望Value.Equals()
方法使用 StringBuilder 的 Equals() 方法。正如我所展示的,StringBuilder 的 Equal() 方法确实返回true
.
我什至尝试过
public bool Equals(T value) {
return EqualityComparer<T>.Default.Equals(Value, value);
}
但这也会返回 false。
所以,这里有两个问题:
- 为什么代码不返回
true
?
- 我怎样才能实施
Equals
方法所以它does return true
?