在方法内创建委托类型

我想在方法中的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中这样做。

为什么要在方法中创建委托类型? 在方法之外声明它有什么问题? 基本上,你不能这样做 – 你不能在方法中声明一个类型 (任何类型)。

一种替代方法是声明.NET 3.5中存在的所有Func / Actiongenerics委托 – 然后您可以这样做:

 public void MyMethod(){ Func mySumImplementation = delegate (int a, int b) { return a+b; }; Console.WriteLine(mySumImplementation(1,1).ToString()); } 

声明在我的C#/ .NET版本页面上 。

委托类型必须在函数外部定义。 可以在方法内部创建实际委托。

 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(); delegate R Func(T t); delegate R Func(T0 t0, T1 t1); delegate R Func(T0 t0, T1 t1, T2 t2); 

然后你可以在上面的代码中使用Func委托。

委托被编译为类(inheritance自System.MulticastDelegate的类)。 在C#中,不允许在方法内声明类(请参阅C#语言规范)。 因此,您也无法在方法中声明委托。

那这个呢:

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