.NET 4.x Делегаты. Захват переменной - C#
Формулировка задачи:
Всем привет.
Так и не смог понять пример изНе могу понять следующие строки:
1. Почему мы вообще можем присвоить ссылку на метод присвоить вот этот метод?
У них же сигнатура вообще разная. Наследования здесь никакого нет, а значит ковариантность и контравариантность здесь вообще не работает.
2. Почему в этой же строке - после имени метода стоят скобки? (Без скобок не работает)
До этого в книге объекты делегата инициализировались просто указанием имени метода БЕЗ скобок.
Шилдт Г. - C# 4.0 полное руководство - 2011
Параграф в книге называетсяПрименение внешних переменных в анонимных методах
. Пример такой:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _9.Применение_захваченной_переменной
{
delegate int CountIt(int end);
class VarCapture
{
public static CountIt Counter()
{
int sum = 0;
CountIt ctObj = delegate(int end)
{
for (int i = 0; i <= end; i++)
{
Console.WriteLine(i);
sum += i;
}
return sum;
};
return ctObj;
}
}
class Program
{
static void Main(string[] args)
{
CountIt count = VarCapture.Counter();
int result;
result = count(3);
Console.WriteLine("Сумма 3 равна " + result);
Console.WriteLine();
result = count(5);
Console.WriteLine("Сумма 5 равна " + result);
}
}
}CountIt count = VarCapture.Counter();
Counter
объектуcount
, если в объявлении делегата указано, что а) возвращаемое значение имеет тип int б) параметр делегата имеет тип int - а в методеСounter
вообще - возвращаемое значение имеет типCountIt
, а параметры вообще отсутствуют ? Короче - почему работает эта строка, которую написал выше? Как вообще можно объекту этого делегатаdelegate int CountIt(int end);
public static CountIt Counter(){...}CountIt count = VarCapture.Counter();
Решение задачи: «.NET 4.x Делегаты. Захват переменной»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _9.Применение_захваченной_переменной
{
delegate int CountIt(int end);
class VarCapture
{
static CountIt Counter() // МЕТОД COUNTER ИЗНАЧАЛЬНО PRIVATE
{
int sum = 0;
CountIt ctObj = delegate(int end)
{
for (int i = 0; i <= end; i++)
{
Console.WriteLine(i);
sum += i;
}
return sum;
};
return ctObj;
}
}
class Program
{
static void Main(string[] args)
{
CountIt count = Counter(); /*СТАТИЧЕСКИЙ МЕТОД ВЫЗЫВАЕТСЯ БЕЗ УКАЗАНИЯ КЛАССА
И ТАКИХ ПРИМЕРОВ В КНИГЕ (ИМЕННО В ЭТОЙ ГЛАВЕ ПРО ДЕЛЕГАТЫ) ПОЛНО*/
int result;
result = count(3);
Console.WriteLine("Сумма 3 равна " + result);
Console.WriteLine();
result = count(5);
Console.WriteLine("Сумма 5 равна " + result);
}
}
}