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

Her*_*ton 12 .net c# boxing equality

我有一个object我想要检查与另一个人平等的情况object.

public static bool Equals(object a, object b)
{
    return a.Equals(b);
}
Run Code Online (Sandbox Code Playgroud)

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");
Run Code Online (Sandbox Code Playgroud)

我认为价值'1'应该只允许一次.

Tim*_*ter 19

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

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

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

public override bool Equals(object obj)
{
    return obj is int && this == (int)obj;
}
Run Code Online (Sandbox Code Playgroud)

因为obj is int返回false,你得到一个false.

编辑:ragarding到您的编辑(Hashtable使用"类似"键):如果您不想允许重复的对象使用Dictionary<int, string>替代(首选)或仅添加整数HashTable.