Возможно ли создать список анонимных делегатов в C#? Вот код, который я хотел бы писать, но он не компилируется:Список <T> где T анонимный делегат возможен?
Action<int> method;
List<method> operations = new List<method>();
Возможно ли создать список анонимных делегатов в C#? Вот код, который я хотел бы писать, но он не компилируется:Список <T> где T анонимный делегат возможен?
Action<int> method;
List<method> operations = new List<method>();
Вы можете написать это, например
Action<int> method = j => j++;
List<Action<int>> operations = new List<Action<int>>();
operations.Add(method);
operations.Add(i => i++);
Это, конечно, можно создать список конкретного типа делегата, как Действие или Func, или любые другие. Поскольку анонимные делегаты могут быть переданы любому типу делегата с совместимой сигнатурой, вы можете создать список делегатов, если у них есть совместимые подписи.
Я не думаю, что создание списка делегатов с несколькими типами подписей было бы очень полезно, так как наличие неуказанной подписи затруднило бы назвать делегата. Однако вы должны быть в состоянии сделать это с отражением. В этом случае вы можете просто использовать список объектов.
Проблема с вашим кодом заключается в том, что вы пытаетесь указать экземпляр как аргумент типа List.
Action<int> method
- пример, тогда как Action<int>
- это тип.
Как упоминается еще один плакат, вам просто нужно объявить тип списка как Action<int>
, то есть только с параметром типа.
например.
var myNum = 5;
var myops = new List<Action<int>>();
myops.Add(j => j++);
myops.Add(j => j++);
foreach(var method in myops)
{
Console.WriteLine(method(myNum));
}
// Frowned upon, but fun syntax
myops.Each(method => method(myNum));
Почему он нахмурился? – recursive
Некоторые люди думают, что подобные виды списков не должны использоваться с операциями, которые имеют побочные эффекты. Каждый метод, подобный этому, имеет побочные эффекты. – Joren
@ Joren: Использование выражений LINQ (в том числе выражений понимания) только для побочных эффектов является проблематичным из-за их ленивой природы. Но анонимные методы и лямбда-выражения предназначены не только для LINQ, и нет никаких оснований ограничивать их чисто функциональностью в целом. Итак, IMO, использование лямбда с «List
Если вам нужно что-то немного более гибкое, чем конкретный делегат, то попытайтесь иметь взгляд на делегате, определенный в ответе на этот вопрос: http://stackoverflow.com/questions/1184329/function-pointers -in-c –