// Возвратить строку, содержащую обратное значение аргумента, 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 () — символьную строку, которая получается обращенной по отношению к строке, передаваемой в качестве аргумента.
В методеMain() создается экземплярintDelделегата, которому присваивается ссылка на методSum ().
SomeOp
МетодSum() принимает аргумент типаintи возвращает значение типаint,поэтому он совместим с целочисленным экземпляром делегатаSomeOp.
Аналогичным образом создается экземплярstrDelделегата, которому присваивается ссылка на методReflect ().
SomeOp
МетодReflect() принимает аргумент типаstringи возвращает результат типаstring,поэтому он совместим со строковым экземпляром делегатаSomeOp.
В силу присущей обобщениям типовой безопасности обобщенным делегатам нельзя присваивать несовместимые методы. Так, следующая строка кода оказалась бы ошибочной в рассматриваемой здесь программе.
Ведь метод Reflect () принимает аргумент типа string и возвращает результат типа string, а следовательно, он несовместим с целочисленным экземпляром делегата SomeOp.
Обобщенные интерфейсы
Помимо обобщенных классов и методов, в C# допускаются обобщенные интерфейсы. Такие интерфейсы указываются аналогично обобщенным классам. Ниже приведен измененный вариант примера из главы 12, демонстрирующего интерфейс ISeries. (Напомним, что ISeries является интерфейсом для класса, генерирующего последовательный ряд числовых значений.) Тип данных, которым оперирует этот интерфейс, теперь определяется параметром типа.
// Продемонстрировать применение обобщенного интерфейса, using System;
public interface ISeries