转换为 void returning 委托的匿名函数不能 return 值
Anonymous function converted to a void returning delegate cannot return a value
我有一个一般性问题:在线程 tFour
下面的 C# 代码中无法创建,编译器向我显示以下错误:“Anonymous function converted to a void returning 委托不能 return 值 "
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace DelegatesAndLambda
{
class Program
{
public static int ThrowNum(object a)
{
Console.WriteLine(a);
return 2 * (int)a;
}
static void Main(string[] args)
{
Func<int> newF = delegate () { int x = ThrowNum(2); return x; };
Thread tOne = new Thread( delegate () { int x = ThrowNum(2); });
Thread tTwo= new Thread(()=> ThrowNum(2));
Thread tThree = new Thread(() => newF());
Thread tFour = new Thread(delegate () { int x = ThrowNum(2); return x;});
}
}
}
但是,线程 tOne
、tTwo
和 tThree
的创建没有错误。那么,为什么 lambda 表达式允许传递具有 return(非空)值和多个参数(ThrowNum(2), newF()
)的方法委托,而具有 return 值(delegate () { int x = ThrowNum(2); return x;}
) 使用delegate关键字定义不能传递?我想在这两种情况下我们都处理匿名方法?我知道 Thread
只接受两种类型的签名:void DoSomething()
和 void DoSomething(object o)
但是 tTwo
和 tFour
使用相同(?)匿名方法?一段时间以来,我一直在努力寻找答案,但没有成功。
谢谢
仅仅因为一个表达式主体的 lambda 表达式有一个结果并不意味着它被使用了。 return 的 lambda 表达式可以将结果转换为具有 void
return 类型的委托,只要它的主体是有效的 语句表达式。这是一个简单的例子:
using System;
class Test
{
static int Method() => 5;
static void Main()
{
Action action = () => Method();
}
}
没关系,因为 Method()
是一个有效的语句表达式。它只是调用方法,而忽略结果。这 not 是有效的,因为 1 + 1
不是有效的语句表达式:
// error CS0201: Only assignment, call, increment, decrement,
// await, and new object expressions can be used as a statement
Action action = () => 1 + 2;
没有表达式主体的匿名方法这样的东西,所以事情变得有点简单:你不能 return 来自匿名方法的值并将该匿名方法转换为委托类型void
return 类型。
C# 5 ECMA 标准的相关部分是 11.7.1:
Specifically, an anonymous function F is compatible with a delegate type D provided:
- ...
- If the body of F is an expression, and either D has a void return type or F is async and D has the return
type Task, then when each parameter of F is given the type of the corresponding parameter in D, the
body of F is a valid expression (w.r.t §12) that would be permitted as a statement-expression (§13.7).
我有一个一般性问题:在线程 tFour
下面的 C# 代码中无法创建,编译器向我显示以下错误:“Anonymous function converted to a void returning 委托不能 return 值 "
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace DelegatesAndLambda
{
class Program
{
public static int ThrowNum(object a)
{
Console.WriteLine(a);
return 2 * (int)a;
}
static void Main(string[] args)
{
Func<int> newF = delegate () { int x = ThrowNum(2); return x; };
Thread tOne = new Thread( delegate () { int x = ThrowNum(2); });
Thread tTwo= new Thread(()=> ThrowNum(2));
Thread tThree = new Thread(() => newF());
Thread tFour = new Thread(delegate () { int x = ThrowNum(2); return x;});
}
}
}
但是,线程 tOne
、tTwo
和 tThree
的创建没有错误。那么,为什么 lambda 表达式允许传递具有 return(非空)值和多个参数(ThrowNum(2), newF()
)的方法委托,而具有 return 值(delegate () { int x = ThrowNum(2); return x;}
) 使用delegate关键字定义不能传递?我想在这两种情况下我们都处理匿名方法?我知道 Thread
只接受两种类型的签名:void DoSomething()
和 void DoSomething(object o)
但是 tTwo
和 tFour
使用相同(?)匿名方法?一段时间以来,我一直在努力寻找答案,但没有成功。
谢谢
仅仅因为一个表达式主体的 lambda 表达式有一个结果并不意味着它被使用了。 return 的 lambda 表达式可以将结果转换为具有 void
return 类型的委托,只要它的主体是有效的 语句表达式。这是一个简单的例子:
using System;
class Test
{
static int Method() => 5;
static void Main()
{
Action action = () => Method();
}
}
没关系,因为 Method()
是一个有效的语句表达式。它只是调用方法,而忽略结果。这 not 是有效的,因为 1 + 1
不是有效的语句表达式:
// error CS0201: Only assignment, call, increment, decrement,
// await, and new object expressions can be used as a statement
Action action = () => 1 + 2;
没有表达式主体的匿名方法这样的东西,所以事情变得有点简单:你不能 return 来自匿名方法的值并将该匿名方法转换为委托类型void
return 类型。
C# 5 ECMA 标准的相关部分是 11.7.1:
Specifically, an anonymous function F is compatible with a delegate type D provided:
- ...
- If the body of F is an expression, and either D has a void return type or F is async and D has the return type Task, then when each parameter of F is given the type of the corresponding parameter in D, the body of F is a valid expression (w.r.t §12) that would be permitted as a statement-expression (§13.7).