non generi c HashCode.Combine - PullRequest
       0

non generi c HashCode.Combine

1 голос
/ 26 мая 2020

Я немного сбит с толку насчет вызова HashCode.Combine нестандартным c способом

HashCode имеет public void Add<T> (T value);

но не public void Add (object value);

В моем случае мне нужно вычислить объединенный хэш-код неизвестного количества объектов неизвестных типов.

Можно ли:

object v1 = ...
object v2 = ...
object v3 = ...

var hashCodeStruct = new HashCode();
hashCodeStruct.Add(v1);
hashCodeStruct.Add(v2);
hashCodeStruct.Add(v3);
var hashCode = hashCodeStruct.ToHashCode();

?

1 Ответ

1 голос
/ 26 мая 2020

Вызов Add<object>(x) и Add<SomeOtherType>(x) даст один и тот же код ha sh. Единственное отличие состоит в том, что первый будет box x, если x является типом значения. Я почти уверен, что Add сделан generi c, поэтому бокс не происходит, если вы передаете тип значения. Однако здесь это не имеет значения, потому что вы имеете дело с отраженными object s (которые, возможно, помещены в рамку перед вызовом Add).

Вот справочный источник Add:

public void Add<T>(T value)
{
    Add(value?.GetHashCode() ?? 0);
}

...

private void Add(int value)
{

    ...

Он просто вызывает частный Add с value s ha sh код. Легко видеть, что одна и та же реализация GetHashCode будет вызываться независимо от того, что такое T, пока value является одним и тем же объектом, потому что полиморфизм времени выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...