我不明白。为什么比较我的类返回false?我想.Equals检查每个元素是否相互= =并且我应该在两个类中分别对我。那么问题是什么?我如何才能做到这一点?
public class MyTest
{
string me;
public MyTest(){}
public MyTest(string v) { me = v; }
public static implicit operator string(MyTest v){return v.me;}
public static implicit operator MyTest(string v) { return new MyTest(v); }
public override string ToString(){ return me;}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("{0}", new MyTest("a").Equals( new MyTest("a")));
Console.WriteLine("{0}", new MyTest("a") == new MyTest("a"));
//false, false
答案 0 :(得分:14)
类是引用类型。因此,默认的'Equals'方法和相等运算符比较实例的'references'(即内存地址),以验证2个实例是否相等。
换句话说:引用类型上的相等性检查2个实例是否是同一个实例。
您可以通过覆盖Equals和GetHashCode方法来覆盖此行为。此外,您可以重载相等和不等于运算符。
答案 1 :(得分:6)
您需要覆盖Equals方法,因为默认情况下,对于引用类型,它会比较它们的引用:
public override bool Equals(object obj)
{
var other = obj as MyTest;
if (other == null)
{
return false;
}
return other.me == me;
}
同样,当覆盖Equals方法时,最好还是覆盖GetHashCode方法:
public override int GetHashCode()
{
return (me ?? string.Empty).GetHashCode();
}
答案 2 :(得分:1)
您需要覆盖Equals
类上的MyTest
方法,并在该方法中实现自定义比较逻辑。如果没有它,默认实现将只比较引用。
请参阅此链接 - Guidelines for Overloading Equals() and Operator == (C# Programming Guide)
答案 3 :(得分:1)
您的班级MyTest
实际上并没有超载运营商Equals
。所以在你打电话的那一天
Console.WriteLine("{0}", new MyTest("a").Equals( new MyTest("a")));
默认情况下,只是做与==
相同的事情。
您需要在类中明确定义相等,如下所示:
public override bool Equals(Object obj)
{
return (MyTest)obj.me == this.me;
}
实际上会将此对象内的字符串与另一个内部的字符串进行比较。现在,调用.Equals
和使用==
运算符都将使用您定义的相等。
编辑:有关更全面的解决方案,请参阅@Darin Dimitrov的答案。
答案 4 :(得分:1)
你不是比较两个类,而是两个不同的类实例;测试返回false,因为您正在比较两个不同的引用。
您可以覆盖此行为,覆盖Equals
和GetHashCode
。
答案 5 :(得分:1)
struct
默认情况下会比较字段; class
默认比较引用。这并不意味着您只需将其设为struct
,以避免拳击等,您还需要覆盖GetHashCode
和Equals
无论如何(加{ {1}}) - 当您完成此操作时,您可以为现有代码完成此操作。
例如:
ToString
答案 6 :(得分:0)
引用类型的等于和'=='查看两个对象是否指向同一引用。它不会检查类的值。您必须重写equals(或实现IEquatable)以提供您自己的逻辑来与类的实例进行比较
答案 7 :(得分:0)
您必须覆盖object.Equals
(和GetHashCode
)。如果不覆盖默认实现,则返回它们是否是同一个对象(而不是比较字段)。
答案 8 :(得分:0)
为什么不使用结构(这是一种值类型,并通过其各部分的比较总和进行比较
public struct MyTest
{
string me;
public MyTest(string v) { me = v; }
public static implicit operator string(MyTest v) { return v.me; }
public static implicit operator MyTest(string v) { return new MyTest(v); }
public override string ToString() { return me; }
}
答案 9 :(得分:-2)
据我所知,默认情况下“==”确定2个对象是否相同;和“等于”比较他们的价值观。