static void Main() { Y Yob = new Y(); ChangeIt change = IncrA; X Xob = change(Yob); Console.WriteLine("Xob: " + Xob.Val); change = IncrB; Yob = (Y)change(Yob); Console.WriteLine("Yob: " + Yob.Val); }
static void Main() { Y Yob = new Y(); // В данном случае параметром метода IncrA является объект класса X, // а параметром делегата ChangeIt — объект класса Y. Но благодаря // контравариантности следующая строка кода вполне допустима. ChangeIt change = IncrA; X Xob = change(Yob); Console.WriteLine("Xob: " + Xob.Val); // В этом случае возвращаемым типом метода IncrB служит объект класса Y, // а возвращаемым типом делегата ChangeIt — объект класса X. Но благодаря // ковариантности следующая строка кода оказывается вполне допустимой. change = IncrB; Yob = (Y)change(Yob); Console.WriteLine("Yob: " + Yob.Val); }
static void Main(string[] args) { Y Yob = new Y(); /* в данном случае параметром метода IncrA является объект класса X, а параметром делегата ChangeIt - объект класса Y. Но благодаря контравариантности * следующая строка кода вполне допустима*/ ChangeIt change = IncrA; X Xob = change(Yob); Console.WriteLine("Xob: " + Xob.val); /* В этом случае вовзращаемым типом метода IncrB служит объект класса Y, а возвращаемым типом делегата ChangeIt - объект класса X. Но благодаря ковариантности * следующая строка кода оказывается вполне допустимой*/ change = IncrB; Yob = (Y)change(Yob); Console.WriteLine("Yob: " + Yob.val); /* приведение типов на 43 строке нужно для того, чтобы соответствовать сигнатуре делегата */ }
static void Main() { Y Yob = new Y(); // In this case, the parameter to IncrA // is X and the parameter to ChangeIt is Y. // Because of contravariance, the following // line is OK. ChangeIt change = IncrA; X Xob = change(Yob); Console.WriteLine("Xob: " + Xob.Val); // In the next case, the return type of // IncrB is Y and the return type of // ChangeIt is X. Because of covariance, // the following line is OK. change = IncrB; Yob = (Y)change(Yob); Console.WriteLine("Yob: " + Yob.Val); }