c# 在異步方法中引用和輸出參數


1 Answers

C#編譯為CIL,CIL不支持此功能。

CIL本身沒有asyncasync方法被編譯為一個類,所有(使用過的)參數和局部變量都存儲在類字段中,因此當調用該類的特定方法時,代碼知道繼續執行的位置以及變量具有的值。

refout參數是使用託管指針實現的,並且不允許使用託管指針類型的類字段,因此編譯器無法保留傳入的引用。

對類字段中託管指針的這種限制會阻止一些無意義的代碼,如Jon Skeet的答案中所解釋的那樣,因為類字段中的託管指針可能引用已返回的函數的局部變量。 但是,這種限制非常嚴格,即使安全和正確使用也會被拒絕。 ref / out字段可以工作,如果它們引用另一個類字段,並且編譯器確保始終在類中包裝通過ref / out傳遞的局部變量(就像它已經知道該怎麼做)。

因此,C#根本無法解決CIL施加的限制。 即使C#設計師想要允許它(我不是說他們這樣做),他們也不能。

c# asynchronous

有誰知道為什麼不允許async方法有refout參數? 我已經做了一些或研究它,但我唯一能找到的是它與堆棧展開有關。



Related