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

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

Например:

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 и C # 2.0.

11.12.2008 13:22:46
4 ОТВЕТА
РЕШЕНИЕ

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

Одной из альтернатив будет объявить все обобщенные делегаты 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());
}

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

25
11.12.2008 13:28:14
«Почему вы хотите создать тип делегата внутри метода?» - потому что единственное, что использует тип делегата, - это обратный вызов, определенный в методе, поэтому распространение содержимого, концептуально локального для метода, вне метода выглядит ... icky.
Adam Parkin 28.01.2015 20:50:11
В .Net 4 вы можете написать: Func <int, int, int> mySumImplementation = (a, b) => a + b;
Tal Segal 5.01.2020 10:45:30
@TalSegal: Это не специфично для .NET 4 - это только начиная с C # 3 и предназначено для любой платформы, использующей Funcсемейство делегатов. Я подозреваю, что я использовал только синтаксис анонимного метода, потому что OP сделал.
Jon Skeet 5.01.2020 12:25:25

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

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>делегата в вашем коде выше.

16
11.12.2008 13:35:30

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

6
26.04.2011 06:54:24

Что насчет этого:

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));
}
0
12.06.2016 21:30:43