Возможен ли список <T>, где T возможен анонимный делегат? - PullRequest
6 голосов
/ 20 сентября 2009

Можно ли создать список анонимных делегатов в C #? Вот код, который я хотел бы написать, но он не компилируется:

Action<int> method;
List<method> operations = new List<method>();

Ответы [ 3 ]

16 голосов
/ 20 сентября 2009

Вы можете написать это, например

        Action<int> method = j => j++;
        List<Action<int>> operations = new List<Action<int>>();

        operations.Add(method);
        operations.Add(i => i++);
3 голосов
/ 20 сентября 2009

Проблема с вашим кодом в том, что вы пытаетесь указать экземпляр в качестве аргумента типа для List.

Action<int> method - это экземпляр, тогда как Action<int> - это тип.

Как упоминает другой автор, вам просто нужно объявить тип списка как Action<int>, то есть только с параметром типа.

1010 *, например *

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));
0 голосов
/ 20 сентября 2009

Конечно, можно создать список определенного типа делегата, например, Action или Func, или любого другого. Поскольку анонимные делегаты могут быть преобразованы в любой тип делегата с совместимой подписью, вы можете создать список делегатов, если они имеют совместимые подписи.

Я не думаю, что создание списка делегатов с несколькими типами подписей было бы полезным, так как наличие неопределенной подписи очень затруднит вызов делегата. Вы должны быть в состоянии сделать это с отражением, хотя. В этом случае вы можете просто использовать список объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...