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;
}
// Возвратить строку, содержащую обратное значение аргумента, static string Reflect(string str) { string result =
foreach(char ch in str)
result = ch + result; return result;
}
static- void Main {
// Сконструировать делегат типа int.
SomeOp
Console.WriteLine(intDel(3));
// Сконструировать делегат типа string.
SomeOp
Console.WriteLine(strDel("Привет")) ;
}
}
Эта программа дает следующий результат.
6
тевирП
Рассмотрим эту программу более подробно. Прежде всего обратите внимание на следующее объявление делегатаSomeOp.
delegate Т SomeOp
Как видите, типТможет служить в качестве возвращаемого типа, несмотря на то, что параметр типаТуказывается после имени делегатаSomeOp.
Далее в классеGenDelegateDemoобъявляются методыSum () иReflect , как показано ниже.
static int Sum(int v) {
static string Reflect(string str) {
МетодSum возвращает результат суммирования целого значения, передаваемого в качестве аргумента, а методReflect () — символьную строку, которая получается обращенной по отношению к строке, передаваемой в качестве аргумента.