4

変数の「動的」タイプを匿名のデリゲートで機能させる可能性があるのではないかと思います。

私は次のことを試しました:

dynamic v = delegate() {
};

しかし、次のエラーメッセージが表示されました。

Cannot convert anonymous method to type 'dynamic' because it is not a delegate type

残念ながら、次のコードも機能しません。

Delegate v = delegate() {
};
object v2 = delegate() {
};

インラインで宣言されたものであっても、任意のタイプのデリゲートを受け入れるメソッドを作成したい場合はどうすればよいですか?

例えば:

class X{
    public void Y(dynamic d){
    }
    static void Main(){
        Y(delegate(){});
        Y(delegate(string x){});
    }
}
4

3 に答える 3

5

これは機能しますが、少し奇妙に見えます。あなたはそれに任意のデリゲートを与えることができます、それはそれを実行し、また値を返します。

また、コンパイラがそれを理解できるようにするために、ある時点で匿名メソッドのシグネチャを指定する必要があります。したがって、Action<T>またはを指定する必要がありますFunc<T>

匿名メソッドをvarに割り当てることができないのはなぜですか?

    static void Main(string[] args)
    {
        Action d = () => Console.WriteLine("Hi");
        Execute(d); // Prints "Hi"

        Action<string> d2 = (s) => Console.WriteLine(s);
        Execute(d2, "Lo"); // Prints "Lo"

        Func<string, string> d3 = (s) =>
        {
            Console.WriteLine(s);
            return "Done";
        };
        var result = (string)Execute(d3, "Spaghettio"); // Prints "Spaghettio"

        Console.WriteLine(result); // Prints "Done"

        Console.Read();
    }

    static object Execute(Delegate d, params object[] args)
    {
        return d.DynamicInvoke(args);
    }
于 2012-05-24T13:55:57.013 に答える
1

デリゲートごとに型を宣言すると、機能します。

// Declare it somewhere
delegate void DelegateType(string s);

// The cast is required to make the code compile
Test((DelegateType)((string s) => { MessageBox.Show(s); }));

public static void Test(dynamic dynDelegate)
{
    dynDelegate("hello");
}
于 2012-05-24T13:59:23.767 に答える
0
Action _;
dynamic test = (_ = () => Console.WriteLine("Test"));
test() // Test
于 2018-01-29T21:10:08.753 に答える