該程式碼片段演示了在lambda 表達式中使用foreach 循環的迭代器變數時出現的意外行為。執行時,它不會列印“Hi String”、“Hi Single”和“Hi Int32”,而是為所有三種方法列印“Hi Int32”。
此行為源自於lambda 表達式及其捕獲變數的性質。當在循環內定義 lambda 表達式時,它會捕獲循環變數的引用,而不是其值。因此,它在整個循環迭代中引用同一個變數。
在提供的程式碼中,變數類型由 lambda 表達式捕獲。但是,該程式碼沒有考慮到循環的所有迭代之間將共享對類型的相同引用這一事實。因此,每個 lambda 表達式最終都會捕獲上次迭代中的 type 值,從而導致意外的列印輸出。
要解決此問題並實現預期目標,您需要確保每個 lambda 表達式捕獲一個唯一的類型值。為此,請為每次迭代建立一個新變量,為其分配類型的當前值:
foreach (var type in types) { var newType = type; var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting)); helloMethods.Add(sayHello); }
透過使用 newType,您可以有效地建立類型的副本,從當前迭代捕獲其值。這可確保每個 lambda 表達式對其自身類型值都有唯一的引用,從而產生正確的輸出。
以上是為什麼我的 Lambda 表達式會捕捉循環變數的最後一個值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!