Ваш делегат объявлен как , ожидающий экземпляр T
и , возвращающий единицу. Поэтому, если вы предоставляете экземпляр Action
, вам необходимо вернуть и Action
. Чтобы делегат вообще ничего не возвращал, используйте другой делегат:
delegate void SecondDel<T>(T item);
или просто Action<T> SecondDel
, который является сокращением для первого.
Однако даже это не поможет вам, если вы поместите всех своих делегатов в один словарь, значение которого равно Delegate
. Однако Delegate
не является строго типизированным, поэтому следующее не будет работать:
var del = BODictionary("myString");
int i = del(1);
var another del = BODictionary("MyString2");
string anotherDel("Hello World");
потому что значения в словаре просто Delegate
. Таким образом, даже если вы вставите Func<int>
(что является еще одним сокращением для delegate T MyDel<T>()
) в тот же словарь с Func<string>
, вы не можете ожидать, что компилятор выведет правильный тип для ожидаемый ключ - это runtime-information . Словарь имеет ровно один единственный тип для всех своих значений, а не только один тип для первого значения и другой тип для второго.
Чтобы выполнить делегатов, вам нужно позвонить DynamicInvoke
. Однако это просто перезапустит object
, который вы должны привести к вашему фактическому типу:
var del = BODictionary("myString");
int i = (int) del.DynamicInvoke(1);
var another del = BODictionary("MyString2");
string str = (string) anotherDel.DynamicInvoke("Hello World");