23

为了创建匿名方法,我想在 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 来做到这一点。

4

4 回答 4

26

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

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

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

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

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

于 2008-12-11T13:28:14.440 回答
17

委托类型必须在函数之外定义。可以像您一样在方法内部创建实际的委托。

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>在上面的代码中使用委托。

于 2008-12-11T13:29:50.677 回答
6

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

于 2011-04-26T06:54:24.520 回答
0

那这个呢:

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));
}
于 2016-06-12T21:21:10.230 回答