为什么((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); } }