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>orFunc<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 回答