Точно какие методы в классе несут ответственность за List<T>
Contains()
?Содержит() метод списка <T>
Я перегрузил == в своем классе. Но, похоже, это не имеет никакого эффекта.
Точно какие методы в классе несут ответственность за List<T>
Contains()
?Содержит() метод списка <T>
Я перегрузил == в своем классе. Но, похоже, это не имеет никакого эффекта.
Он просто позвонит Equals()
- это все, что нужно переопределить (или нет, если вы довольны сравнительными сравнениями идентичности). Если тип реализует IEquatable<T>
, тогда эта реализация будет использоваться вместо общего Equals(object)
.
В частности, из документации для List<T>.Contains
:
Этот метод определяет равенство, используя равенство по умолчанию компаратор
EqualityComparer(T).Default
дляT
, то типа значений в списке.
И от EqualityComparer<T>.Default
: реализует
В
Default
проверяет свойство ли типаT
общего интерфейсSystem.IEquatable(T)
и если это так возвращаетEqualityComparer(T)
, который использует эту реализации. В противном случае он возвращает aEqualityComparer(T)
, который использует переопределенияObject.Equals
иObject.GetHashCode
предоставленныйT
.
Я не верю, что он будет использовать GetHashCode
.
Это будет либо вызвать Object.Equals()
или, если вы реализовали, IEquatable<T>.Equals()
:
private static EqualityComparer<T> CreateComparer()
{
Type c = typeof(T);
if (c == typeof(byte))
{
return (EqualityComparer<T>) new ByteEqualityComparer();
}
if (typeof(IEquatable<T>).IsAssignableFrom(c))
{
return (EqualityComparer<T>) typeof(GenericEqualityComparer<int>).TypeHandle.CreateInstanceForAnotherGenericParameter(c);
}
if (c.IsGenericType && (c.GetGenericTypeDefinition() == typeof(Nullable<>)))
{
Type type2 = c.GetGenericArguments()[0];
if (typeof(IEquatable<>).MakeGenericType(new Type[] { type2 }).IsAssignableFrom(type2))
{
return (EqualityComparer<T>) typeof(NullableEqualityComparer<int>).TypeHandle.CreateInstanceForAnotherGenericParameter(type2);
}
}
return new ObjectEqualityComparer<T>();
}
из принципов .NET - если вы реализуете == всегда обеспечивают реализацию для Object.equals() и = оператор. Причина в том, что операторы не являются частью какого-либо интерфейса, и их использование не допускается в общих реализациях (класс List не может вызывать оператор == на T, потому что нет гарантии, что T будет иметь определенный оператор (см., Например, структуры)).
Некоторые хорошие ответы здесь. Почему бы не принять один ... – Vaccano
Я забыл принять. – anonymous