У меня есть класс (Foo
), которая требуется для сравнения T
объектов типа, однако T
не всегда может реализовать IComparable и конструктор должен быть в состоянии использовать с нулевым comparer
паров. Для того, чтобы поймать это на создание Foo
я попытался следующее:Обеспечения действительный IComparer используется
public sealed class Foo<T>
{
private readonly IComparer<T> _comparer;
public Foo(IComparer<T> comparer)
{
_comparer = comparer ?? Comparer<T>.Default;
if (_comparer == null)
throw new NotSupportedException("A comparer was not passed for T and no default was found for T. ");
}
}
Я предположил (ошибочно), что Comparer<T>.Default
будет нулевым, если объект не реализовать IComparable<T>
, но вместо этого Default
будет возвращать действительный Comparer
, который бросает ArgumentsException
когда сравнение называется, и я не смог найти решение путем исследования того, как подойти к этой ситуации.
Как подойти к этой ситуации?
EDIT: Для уточнения Этот класс должен иметь возможность сортировать объекты типа T с использованием данного Comparer. Но T может не всегда иметь IComparable, но когда предоставляется Comparer, он должен все же иметь возможность сортировать те ограничения объектов, которые нарушили бы это требование. Однако, если переданное в Comparer значение null, то оно должно попытаться использовать Default
. Если объект IComparable, все хорошо, если он не должен бросать NotSupportedException
.
Проверить MSDN страницы для Comparer (T) .Default: https://msdn.microsoft.com/en-us/library/azhsac5f(v=vs.110).aspx. В частности, в примечаниях упоминается следующее: «Если тип T не реализует общий интерфейс System.IComparable, это свойство возвращает Comparer , который использует интерфейс System.IComparable." –
Может ли что-то вроде этого помочь в вашем случае: http://stackoverflow.com/a/503359/6741868? Не проверял. –
Я сделал ошибку, не глядя на документацию в первую очередь. :/Я видел этот пост в своих путешествиях, но я не был уверен, что он соответствует тому, что я пытался сделать. Принятый ответ кажется более чистым. – BarelyTilted