Предположим, у меня есть неограниченный общий метод, который работает на всех типах, поддерживающих равенство. Он выполняет проверку равенства попарно и так работает в О (п):Как условно вызывать общий метод с ограничениями?
public static int CountDuplicates<T>(IList<T> list)
{
/* ... */
}
У меня также есть общий метод ограниченного, который работает только с типами поддержки сортировки. Она начинается с сортировки списка в O (п журнал п), а затем подсчитывает все дубликаты за один проход:
public static int CountDuplicatesFast<T>(IList<T> list)
where T : IComparable<T>
{
/* ... */
}
Таким образом, вызывающий абонент может выбрать для вызова быстрого метода, если он статический известен, что тип элементов списка поддерживает упорядочение. Может случиться так, что сам вызывающий объект работает с общим IList<T>
, где T не имеет ограничений, поэтому его единственный способ вызвать первый (медленный) метод.
Теперь я хочу, чтобы первый метод проверки во время выполнения, если тип T
фактически реализует интерфейс IComparable<T>
и если да, то вызвать быстрый метод:
public static int CountDuplicates<T>(IList<T> list)
{
if (typeof(IComparable<T>).IsAssignableFrom(typeof(T)))
{
return CountDuplicatesFast(list);
}
else
{
/* use the slow algorithm */
}
}
Проблема в том, что компилятор отвергает вызов CountDuplicatesFast(list)
:
ошибка CS0314: тип 'Т' не может быть использован в качестве параметра типа 'Т' в универсальном типе или методе «Program.CountDuplicatesFast <T> (System.Collections.Generic.IList < Т >). Нет преобразования преобразования бокса или преобразования параметров типа из «T» в «System.IComparable <T>».
Можно ли убедить компилятор доверять мне, что я знаю, что я делаю, и пропустить проверку ограничения?
Вы пробовали использовать Cast? 'вернуть CountDuplicatesFast (list.Cast>() ToList().);' –
Nevyn
@Nevyn, который производит «тип 'System.IComparable' не может быть использован в качестве параметра типа 'Т' в универсальном типе или метод 'UserQuery.MyType.CountDuplicatesFast (System.Collections.Generic.IList ). Нет никакого неявного преобразования ссылок из' System.IComparable 'to' System.IComparable > '. " –
Интересно. Почти правильный путь, но полностью неправильное исполнение.Полагаю, мне нужно будет написать тестовую программу и попробовать несколько разных вещей. Я думаю, что актеры могли бы это сделать ... но я понятия не имею, как точно ... ну, для первой догадки это было не так уж далеко :-) – Nevyn