簡體   English   中英

在方法中創建委托類型

[英]Creating a delegate type inside a method

我想在 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/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 版本頁面上

委托類型必須在函數外部定義。 可以像您一樣在方法內部創建實際的委托。

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>委托。

委托被編譯為類(從 System.MulticastDelegate 繼承的類)。 在 C# 中,不允許在方法中聲明類(請參閱 C# 語言規范)。 因此,您也不能在方法中聲明委托。

那這個呢:

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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM