Предположим, у меня есть общий MyClass<T>
, который должен сравнивать два объекта типа <T>
. Обычно я бы сделал что-то вроде...
void DoSomething(T o1, T o2)
{
if(o1.Equals(o2))
{
...
}
}
Теперь предположим, что мой MyClass<T>
имеет конструктор, который поддерживает передачу пользовательского IEqualityComparer<T>
, похожего на Dictionary<T>
. В этом случае мне нужно будет...
private IEqualityComparer<T> _comparer;
public MyClass() {}
public MyClass(IEqualityComparer<T> comparer)
{
_comparer = comparer;
}
void DoSomething(T o1, T o2)
{
if((_comparer != null && _comparer.Equals(o1, o2)) || (o1.Equals(o2)))
{
...
}
}
Чтобы удалить этот длинный оператор if, было бы хорошо, если бы у меня был _comparer
по умолчанию "сопоставитель по умолчанию", если используется обычный конструктор. Я искал что-то вроде typeof(T).GetDefaultComparer()
, но не смог найти ничего подобного.
Я нашел EqualityComparer<T>.Default
, могу ли я использовать это? И тогда этот фрагмент...
public MyClass()
{
_comparer = EqualityComparer<T>.Default;
}
void DoSomething(T o1, T o2)
{
if(_comparer.Equals(o1, o2))
{
...
}
}
... дают те же результаты, что и при использовании o1.Equals(o2)
для всех возможных случаев?
(Как побочная заметка, означало бы это также, что мне также нужно использовать любое специальное обобщенное ограничение для <T>
?)