// Возвратить логическое значение true, если значение // переменной obj.Val окажется четным. static bool IsEven(Alpha obj) { if ((obj.Val % 2) == 0) { return(true); } return(false); }
static void Main() { Alpha objA = new Alpha(4); Beta objB = new Beta(9); // Продемонстрировать сначала контравариантность. // Объявить делегат SomeOp<Alpha> и задать для него метод IsEven. SomeOp <Alpha> checkIt = IsEven; // Объявить делегат SomeOp<Beta>. SomeOp <Beta> checkIt2; // А теперь- присвоить делегат SomeOp<Alpha> делегату SomeOp<Beta>. // *** Это допустимо только благодаря контравариантности. *** checkIt2 = checkIt; // Вызвать метод через делегат. Console.WriteLine(checkIt2(objB)); // Далее, продемонстрировать ковариантность. // Объявить сначала два делегата типа AnotherOp. // Здесь возвращаемым типом является класс Beta, // а параметром типа - класс Alpha. // Обратите внимание на то, что для делегата modifyIt // задается метод ChangeIt. AnotherOp <Beta, Alpha> modifyIt = ChangeIt; // Здесь возвращаемым типом является класс Alpha, // а параметром типа — тот же класс Alpha. AnotherOp <Alpha, Alpha> modifyIt2 = ChangeIt; // А теперь присвоить делегат modifyIt делегату modifyIt2. // *** Это допустимо только благодаря ковариантности. *** modifyIt2 = modifyIt; // Вызвать метод и вывести результаты на экран. objA = modifyIt2(objA); Console.WriteLine(objA.Val); }
static Beta ChangeIt(Alpha obj) { return(new Beta(obj.Val + 2)); }