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

メソッド内でデリゲート型を作成する理由は何ですか? メソッドの外で宣言することの何が問題になっていますか? 基本的に、これはできません。メソッド内で(あらゆる種類の型) を宣言することはできません。

1 つの代替方法は、.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 Versions pageにあります。

于 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 に答える