【发布时间】:2017-02-23 18:24:29
【问题描述】:
我正在尝试使用输入参数 int 创建 .net 标准委托 Action。但我得到了
无法将类型“void”隐式转换为 System.Action。
我了解到可以将相同的返回类型方法添加到多播委托中。下面是我的代码。这段代码有什么问题?如果我编写 lambda 表达式,我看不到编译错误。
static void Main(string[] args)
{
Action<int> AddBook = AddBookwithId(15); // Here is the error
AddBook += x => Console.WriteLine("Added book with :{0}" , x ); // No compile error here
AddBook += AddBookwithISBN(56434);// of course, the same error here too.
}
public static void AddBookwithId(int y)
{
Console.WriteLine( "Added Book to the shelf with the ID : {0} ", y );
}
public static void AddBookwithISBN(int y)
{
Console.WriteLine("Added Book to the shelf with the ISBN: {0} ", y + 2);
}
【问题讨论】:
-
你在第一行调用函数。等号的RHS是
AddBookwithId(15)是一个函数调用。第二行是添加一个 lambda 表达式。 add-assignment 的 RHS 是x => Console.WriteLine(...),它是一个带有参数x和一个调用Console.WriteLine()的主体的 lambda 表达式。第三行再次调用该函数。 RHS 是AddBookwithISBN(56434),这是一个函数调用。 -
AddBookwithId的值是对方法的引用。带括号的AddBookwithId(15)是对方法的调用,所以AddBookwithId(15)的值就是方法返回的值——在这种情况下void什么都没有。您不想将调用结果提供给事件处理程序;您想告诉处理程序如何调用方法本身。因此你想给它一个方法的引用:AddBookwithId.