[英]Get a return from an anonymous function converted to a void returning delegate
[英]Anonymous function converted to a void returning delegate cannot return a value
我有一個普遍的問題:在下面的C#代碼中,無法創建線程tFour
並且編譯器向我顯示以下錯誤:“ 匿名函數轉換為void返回委托無法返回值 ”
代碼
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(非void)值和多個參數( ThrowNum(2), newF()
)的方法delegate () { int x = ThrowNum(2); return x;}
而帶有返回值的匿名方法( delegate () { int x = ThrowNum(2); return x;}
)使用delegate關鍵字定義不能傳遞? 我認為在這兩種情況下我們都處理匿名方法? 我知道Thread
只接受兩種類型的簽名: void DoSomething()
和void DoSomething(object o)
但是使用相同的(?)匿名方法初始化tTwo
和tFour
之間的主要區別是什么? 我一直試圖找到答案,但沒有成功。 謝謝
僅僅因為表達式的lambda表達式具有結果並不意味着它被使用。 對於lambda表達式來說很好,只要它的主體是有效的語句表達式 ,它就會返回一個轉換為具有void
返回類型的委托的結果。 這是一個簡單的例子:
using System;
class Test
{
static int Method() => 5;
static void Main()
{
Action action = () => Method();
}
}
沒關系,因為Method()
是一個有效的語句表達式。 它只調用方法,並忽略結果。 這不會有效,因為1 + 1
不是有效的語句表達式:
// error CS0201: Only assignment, call, increment, decrement,
// await, and new object expressions can be used as a statement
Action action = () => 1 + 2;
沒有表達式的匿名方法,所以事情變得有點簡單:你只是不能從匿名方法返回一個值並將該匿名方法轉換為具有void
返回類型的委托類型。
C#5 ECMA標准的相關部分是11.7.1:
具體來說,匿名函數F與提供的委托類型D兼容:
- ...
- 如果F的主體是一個表達式,並且D具有void返回類型或者F是異步而D具有返回類型Task,那么當F的每個參數都給出D中相應參數的類型時,F的主體是一個有效的表達式(wrt§12),它將被允許作為statement-expression(§13.7)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.