На этом шаге мы рассмотрим задание ограничений на обобщенные параметры в обобщенных делегатах и методах.
Еще один пример иллюстрирует, как ограничения на обобщенные параметры реализуются в случае использования обобщенных делегатов и методов.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr267_1 { // Обобщенный делегат с ограничением // на обобщенный параметр: delegate T MD<T>(T[] arg) where T: struct; // Главный класс: class Program { // Статический обобщенный метод с ограничением на // обобщенный параметр: static T First<T>(T[] t) where T: struct{ return t[0]; } // Статический обобщенный метод (без ограничений на // обобщенный параметр): static T Last<T>(T[] t){ return t[t.Length - 1]; } // Обычный (не обобщенный) статический метод: static int MaxVal(int[] a){ int val = a[0]; for(int k = 1; k < a.Length; k++) { if (val < a[k]) val = a[k]; } return val; } // Главный метод: static void Main() { // Создание экземпляров делегата: MD<int> A = First<int>; MD<char> B = Last; MD<int> C = MaxVal; // Вызов экземпляров делегата: int x = A(new int[]{10, 7, 3, 1}); char y = B(new char[]{ 'A', 'C', 'F'}); int z = C(new int[]{1, 7, 2, 5, 11, 9, 3, 6}); // Проверка результата: Console.WriteLine("Значение: {0}, {1} и {2}", x, y, z); // Задержка: Console.ReadLine(); } } }
Ниже показано, как выглядит результат выполнения программы:
Рис.1. Результат работы приложения
В данном случае мы описываем обобщенный делегат MD с одним обобщенным параметром (обозначен как T). На обобщенный параметр накладывается ограничение where T: struct, то есть параметром может быть нессылочный тип. Делегат соответствует методам, у которых аргумент является массивом, а результат - значением того же типа, что и элементы массива. Также в программе есть три статических метода: два обобщенных и один обычный (не обобщенный). Обобщенный метод First() результатом возвращает значение первого элемента массива, переданного аргументом методу На обобщенный параметр метода накладывается такое же ограничение, как и на параметр обобщенного делегата. Обобщенный метод Last() результатом возвращает значение последнего элемента массива, переданного аргументом методу (на обобщенный параметр метода ограничения не накладываются). Наконец, аргументом методу MaxVal() передается целочисленный массив, а результатом возвращается значение наибольшего элемента в массиве.
В главном методе на основе статических методов создаются экземпляры для обобщенного делегата MD, причем при присваивании экземпляру ссылки на обобщенный метод последний мы указываем как с явной спецификацией значения обобщенного типа (команда
MD<int> A = First<int>;
MD<char> B = Last;
MD<int> C = MaxVal;
На следующем шаге мы подведем итог изученному материалу.