В любом случае
Вызов обобщенного метода с явно указанными аргументами типа
В большинстве случаев неявной выводимости типов оказывается достаточно для вызова обобщенного метода, тем не менее аргументы типа могут быть указаны явным образом. Для этого достаточно указать аргументы типа после имени метода при его вызове. В качестве примера ниже приведена строка кода, в которой методCopylnsert() вызывается с явно указываемым аргументом типаstring.
ArrayUtils.CopyInsert
Тип передаваемых аргументов необходимо указывать явно в том случае, если компилятор не сможет вывести тип параметраТили если требуется отменить выводимость типов.
Применение ограничений в обобщенных методах
На аргументы обобщенного метода можно наложить ограничения, указав их после списка параметров. В качестве примера ниже приведен вариант методаCopylnsert ()для обработки данных только ссылочных типов.
public static bool CopyInsert
T[] src, T[] target) where T : class {
Если попробовать применить этот вариант в предыдущем примере программы обработки массивов, то приведенный ниже вызов методаCopylnsert( •) не будет скомпилирован, посколькуintявляется типом значения, а не ссьглочным типом.
// Теперь неправильно, поскольку параметр Т должен быть ссылочного типа! ArrayUtils.Copylnsert(99, 2, nums, nums2); // Теперь недопустимо!
Обобщенные делегаты
Как и методы, делегаты также могут быть обобщенными. Ниже приведена общая форма объявления обобщенного делегата.
delegate
Обратите внимание на расположение списка параметров типа. Он следует непосредственно после имени делегата. Преимущество обобщенных делегатов заключается в том, что их допускается определять в типизированной обобщенной форме, которую можно затем согласовать с любым совместимым методом.
В приведенном ниже примере программы демонстрируется применение делегатаSomeOpс одним параметром типаТ.Этот делегат возвращает значение типаТи принимает аргумент типаТ. '
// Простой пример обобщенного делегата, using System;
// Объявить обобщенный делегат, delegate Т Some0p
class GenDelegateDemo {
// Возвратить результат суммирования аргумента, static int Sum(int v) { int result = 0; for(int i=v; i>0; i—) result += i;
return result;
}