Подтвердить что ты не робот

Создание типа делегата внутри метода

Я хочу создать тип делегата в С# внутри метода с целью создания анонимных методов.

Пример:


public void MyMethod(){
   delegate int Sum(int a, int b);

   Sum mySumImplementation=delegate (int a, int b) {return a+b;}

   Console.WriteLine(mySumImplementation(1,1).ToString());
}

К сожалению, я не могу это сделать в .NET 2.0 и С# 2.0.

4b9b3361

Ответ 1

Почему вы хотите создать тип делегата в методе? Что неправильно с объявлением его вне метода? В принципе, вы не можете этого сделать - вы не можете объявить тип (любой тип) внутри метода.

Одним из вариантов было бы объявить все общие делегаты Func/Action, которые присутствуют в .NET 3.5, - тогда вы можете просто сделать:

public void MyMethod(){
    Func<int, int, int> mySumImplementation = 
        delegate (int a, int b) { return a+b; };

    Console.WriteLine(mySumImplementation(1,1).ToString());
}

Объявления находятся на моей странице С#/.NET версии.

Ответ 2

Тип делегата должен быть определен вне функции. Фактический делегат может быть создан внутри метода так же, как и вы.

class MyClass {
  delegate int Sum(int a, int b);
  public void MyMethod(){

       Sum mySumImplementation=delegate (int a, int b) {return a+b;}

       Console.WriteLine(mySumImplementation(1,1).ToString());
  }

}

будет действительным. Лучшее решение может состоять в том, чтобы эмулировать .NET3.5 и создать глобальные типы делегатов, которые можно использовать по всему вашему решению, чтобы избежать необходимости постоянно обновлять типы делегирования для всего:

delegate R Func<R>();
delegate R Func<T, R>(T t);
delegate R Func<T0, T1, R>(T0 t0, T1 t1);
delegate R Func<T0, T1, T2, R>(T0 t0, T1 t1, T2 t2);

Затем вы можете просто использовать делегат Func<int, int, int> в своем коде выше.

Ответ 3

Делегаты компилируются в классы (класс, который наследуется от System.MulticastDelegate). В С# вам запрещено объявлять класс внутри метода (см. Спецификацию языка С#). Таким образом, вы также не можете объявить делегата в методе.

Ответ 4

Как насчет этого:

static void Main(string[] args)
{
    Expression<Func<int, int, int>> exFunc = (a, b) => a + b;
    var lambda = exFunc as LambdaExpression;
    Delegate del = exFunc.Compile();
    Console.WriteLine(del.DynamicInvoke(2, 2));
}