1. 程式人生 > >C# Error CS1628: 不能在匿名方法、lambda 表示式或查詢表示式中使用 ref 或 out 引數

C# Error CS1628: 不能在匿名方法、lambda 表示式或查詢表示式中使用 ref 或 out 引數

寫c#windows窗體應用的時候, 在一個函式裡傳遞了ref的引數, 並且在這個函式裡呼叫了窗體的invoke方法,結果出了cs1628的錯誤。去Stack Overflow上找了一篇解釋,特翻譯在下面:

lambda表示式有改變所捕獲的變數的生命週期的特性。舉個例子,下面的lamda表示式導致引數p1存在時間比該方法還要長,體現在它的值能夠在這個方法框架不在堆中存在後還能夠被獲取。

Func<int> Example(int p1) 
{   
    return () => p1;
} 

被捕獲變數的另一個屬性是,(在lambda表示式中)對這個變數的修改在這個表示式的外邊也可見。下面這個例子將print出42:

void Example2(int p1) 
{  
    Action del = () => { p1 = 42; }  
    del();
    Console.WriteLine(p1); 
} 

這兩個屬性在以下方面違反了ref引數:

  • ref 引數也許有一個固定的生命週期。比如傳遞一個區域性變數作為ref引數給函式
  • lambda表示式的副作用也許會使ref引數對外可見。不論是在方法中還是呼叫者中。

    這些就是一部分不相容的屬性。也是ref引數不能被允許在lambda表示式中使用的原因之一。