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 void Main() { Alpha objA = new Alpha(4); Beta objB = new Beta(9); // First demonstrate contravariance. // Declare a SomeOp<Alpha> delegate and set it to IsEven. SomeOp <Alpha> checkIt = IsEven; // Declare a SomeOp<Beta> delegate. SomeOp <Beta> checkIt2; // Now, assign the SomeOp<Alpha> delegate the SomeOp<Beta> delegate. // *** This is legal only because of contravariance. *** checkIt2 = checkIt; // Call through the delegate. Console.WriteLine(checkIt2(objB)); // Now, demonstrate covariance. // First, declare two AnotherOp delegates. // Here, the return type is Beta and the parameter type is Alpha. // Notice that modifyIt is set to ChangeIt. AnotherOp <Beta, Alpha> modifyIt = ChangeIt; // Here, the return type is Alpha and the parameter type is Alpha. AnotherOp <Alpha, Alpha> modifyIt2; // Now, assign modifyIt to modifyIt2. // *** This statement is legal only because of covariance. *** modifyIt2 = modifyIt; // Actually call the method and display the results. objA = modifyIt2(objA); Console.WriteLine(objA.Val); }