Предположим, у меня есть общий 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
default по умолчанию для 'default 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>
?)