簡體   English   中英

轉換為void返回委托的匿名函數無法返回值

[英]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;});
        }
    }
}

但是,創建線程tOnetTwotThree沒有錯誤。 那么為什么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)但是使用相同的(?)匿名方法初始化tTwotFour之間的主要區別是什么? 我一直試圖找到答案,但沒有成功。 謝謝

僅僅因為表達式的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM