我在关于匿名方法(C#编程指南)的MSDN文档中阅读本文,但我不理解省略参数列表的部分.它说:
有一种情况是匿名方法提供lambda表达式中找不到的功能.匿名方法使您可以省略参数列表.这意味着可以将匿名方法转换为具有各种签名的委托.lambda表达式无法做到这一点.
你能举一个省略匿名方法参数列表的例子吗?
看完这个相关的答案后 - 我还有一个问题
lambda表达式是一个代替委托实例编写的未命名方法.编译器立即将lambda表达式转换为:
但是什么时候它会转换它做一个委托实例 - 何时将它转换为表达式树?(没有找到关于那个的相关信息)
没有太多相关的代码 - 只是尝试使用它 - 显然两者都匹配.我不这么认为,因为我认为一个人会更好.
void Main()
{
Foo( () => 0 );
}
void Foo(Func<int > action)
{
Console.WriteLine("1");
}
void Foo(Expression<Func<int>> func)
{
Console.WriteLine("2");
}
Run Code Online (Sandbox Code Playgroud)
这将导致错误(以下方法或属性之间不明确)
我在这里读Jon Skeet的答案
他的一个样本是:
static void Main()
{
int x = 0;
Foo( delegate { return x; } );
}
static void Foo(Func<int, int> action)
{
Console.WriteLine("I suspect the anonymous method...");
}
Run Code Online (Sandbox Code Playgroud)
但是如何Foo(Func<int, int>)处理delegate { return x; }哪个是Func<int>?
事实上也Func< int,int,int,int,...>可以处理delegate { return x; }......
问题1 对此行为有任何解释吗?
问题2
我有这个代码:
class MyClass
{
public delegate void MyEventHandler(object sender);
public event MyEventHandler MyEvent;
}
Run Code Online (Sandbox Code Playgroud)
我想使用通用处理程序,所以:
class MyClass
{
public Action<object> MyEventHandler;
public …Run Code Online (Sandbox Code Playgroud) 是否可以在单个语句中重写以下代码?
foreach(var myVar in varEnumerable)
{
MyMethod(myVar);
Thread.Sleep(2000);
}
Run Code Online (Sandbox Code Playgroud)
如果没有Thread.Sleep(),我会把它写成:
varEnumerable.ToList().ForEach(x => MyMethod(x));
Run Code Online (Sandbox Code Playgroud)