Si consideri il seguente codice:Confuso su diverse implementazioni di GetHashCode() per brevi e USHORT
private static void TestHashCode<T>()
{
dynamic initialValue = 10;
Console.WriteLine("{0}: {1}", typeof(T).Name, ((T)initialValue).GetHashCode());
}
TestHashCode<int>();
TestHashCode<uint>();
TestHashCode<long>();
TestHashCode<ulong>();
TestHashCode<short>();
TestHashCode<ushort>();
uscita:
Int32: 10
UInt32: 10
Int64: 10
UInt64: 10
Int16: 655370
UInt16: 10
vedere la differenza tra short
e ushort
? In effetti, il codice sorgente è diversa per queste classi:
// ushort
public override int GetHashCode()
{
return (int) this;
}
// short
public override int GetHashCode()
{
return (int) (ushort) this | (int) this << 16;
}
Ma allo stesso tempo, GetHashCode()
implementazioni per firmati/versioni unsigned di int
e long
sono uguali:
// int and uint
public override int GetHashCode()
{
return (int) this;
}
// long and ulong
public override int GetHashCode()
{
return (int) this^(int) (this >> 32);
}
Potrebbe spiegare perché c'è una differenza tra le implementazioni short
e ushort
di GetHashCode()
?
Forse qualcuno ha dimenticato di fare la stessa implementazione per il corto senza firma? .. – dasblinkenlight
Trovo la tua domanda interessante, ma non c'è motivo per cui le due implementazioni dovrebbero essere le stesse, o perché dovrebbero essere diverse. È solo "un'implementazione che funziona". Non c'è alcun vincolo che affermi che hashcode per firmato/non firmato dovrebbe essere lo stesso. In particolare. Questa implementazione è realizzata in modo tale che un ushort breve e uno zero non possa mai avere lo stesso hash. Questo non può essere fatto per interi e long, perché sono grandi almeno quanto l'hash. –
FWIW, 'sbyte' sembra avere lo stesso tipo di implementazione di' short'. –