我想知道是否有可能让变量的“动态”类型适用于匿名代表。
我尝试了以下内容:
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){});
}
}
答案 0 :(得分:5)
这有效,但看起来有点奇怪。你可以给它任何委托,它将运行它并返回一个值。
您还需要在某些时候指定匿名方法签名 ,以便编译器能够理解它,因此需要指定Action<T>
或Func<T>
或者其他什么。
Why can't an anonymous method be assigned to 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);
}
答案 1 :(得分: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");
}
答案 2 :(得分:0)
Action _;
dynamic test = (_ = () => Console.WriteLine("Test"));
test() // Test