为什么((object)(int)1).Equals(((object)(ushort)1))产生错误?

我有一个情况,我有一个object ,我想检查与另一个object相等性。

 public static bool Equals(object a, object b) { return a.Equals(b); } 

a = 1 (integer)b = 1 (ushort (or basically not integer)) 。 我想知道这不应该是真的,但它确实会返回假…

编辑

更糟糕的是:

 Hashtable ht = new Hashtable(); ht.Add((int)1, "SOME STRING"); ht.Add((short)1, "SOME STRING"); ht.Add((long)1, "SOME STRING"); 

我认为值’1’应该只允许一次。

仅当另一个对象也是Int32的实例时, Int32.Equals(object)返回true:

如果obj是Int32的实例并且等于此实例的值,则返回true;否则返回false。 否则,是的。

在代码中( ILSpy ,.NET 4):

 public override bool Equals(object obj) { return obj is int && this == (int)obj; } 

由于obj is int返回false,因此得到false

编辑 :ragarding到您的编辑(具有“类似”键的Hashtable ):如果您不想允许重复的对象使用Dictionary而不是(首选)或仅添加整数到HashTable

这是一个简单的类和相等比较器的实现。 正如您所看到的,equals的标准apporach是确保它们首先是同一时间,然后是内部匹配(在我们的例子中是字符串和日期)。

如果你想要别的东西,你可以随时将它覆盖到你的心脏内容,并将两面都放在你满意的东西上:)

 public struct InputEntry { public DateTime Date { get; set; } public string Entry { get; set; } public bool Equals(InputEntry other) { return Date.Equals(other.Date) && string.Equals(Entry, other.Entry); } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) return false; return obj is InputEntry && Equals((InputEntry) obj); } public override int GetHashCode() { unchecked { return ( Date.GetHashCode()*397) ^ (Entry != null ? Entry.GetHashCode() : 0); } } public static bool operator ==(InputEntry left, InputEntry right) { return left.Equals(right); } public static bool operator !=(InputEntry left, InputEntry right) { return !left.Equals(right); } private sealed class EntryDateEqualityComparer : IEqualityComparer { public bool Equals(InputEntry x, InputEntry y) { return string.Equals(x.Entry, y.Entry) && x.Date.Equals(y.Date); } public int GetHashCode(InputEntry obj) { unchecked { return ( (obj.Entry != null ? obj.Entry.GetHashCode() : 0)*397) ^ obj.Date.GetHashCode(); } } } private static readonly IEqualityComparer EntryDateComparerInstance = new EntryDateEqualityComparer(); public static IEqualityComparer EntryDateComparer { get { return EntryDateComparerInstance; } } } 

因为它们没有相同的类型。 您可以尝试将它们都转换为int,然后比较int,如果转换成功。

 public static bool Equals(object a, object b) { try { return ((int)a).equals((int)b); } catch { return a.Equals(b); } }