Вкратце: возможно ли определить универсальный метод, в котором параметр типа (T
) ограничен string
или int[]
? В псевдо-C # я хочу сделать следующее:
public static int MyMethod<T> ( T arg1, T arg2 )
where T : (has an indexer that returns an int) {
// stuff with arg1[i], arg2[j], etc...
}
Обратите внимание, что в C # из-за встроенного индексатора string
(который возвращает char
) наряду с неявным преобразованием из char
в int
следующее выражение означает точно то же самое, будь то source
это string
или int[]
:
int someval = source[index];
По потоку Ограничить универсальный метод расширения базовыми типами и строкой Я понимаю, что не могу просто сделать список несвязанных типов в предложении ограничения where T : x...
. И int[]
, и string
будут соответствовать T: IEnumerable<int>
, но IEnumerable<T>
не требует, чтобы разработчики имели индексатор, что является в точности общей чертой, которую я использую в обоих типах.
Цель этого заключается в том, что я создаю несколько высоко оптимизированных функций анализа и анализа строк, таких как быстрая реализация алгоритма расстояния Дамерау – Левенштейна. Я обнаружил, что первое преобразование моих строк в массивы int может иногда приводить к значительно более быстрым выполнениям при повторяющейся посимвольной обработке (как в алгоритме D-L). Во многом это связано с тем, что сравнение int
значений намного быстрее, чем сравнение char
значений.
Действующее слово «иногда». Иногда быстрее работать непосредственно со строками и избежать затрат на первое преобразование и копирование в массивы int
. Теперь у меня есть методы, которые действительно идентичны, за исключением объявлений.
Конечно, я могу использовать dynamic
, но снижение производительности из-за проверки во время выполнения полностью уничтожает любые выгоды, полученные при построении методов. (Я сделал проверить это).