不能对匿名方法使用 ref 或 out 参数

Cannot use use ref or out parameter for anonymous methods

    static BackgroundWorker worker; 
    static void Main(string[] args) 
    { 
      worker = new BackgroundWorker();
      worker.DoWork += worker_DoWork; 
      worker.RunWorkerAsync();
      Console.ReadLine(); 
    } 
    static void worker_DoWork(object sender,DoWorkEventArgs e) 
    { 
      string strClientId = "2211"; Authenticate(ref strClientId); 
    }
    static void Authenticate(ref string strClientId) 
    {
       Timer timer = new Timer(500); 
       //Error in this line 
       //Cannot use ref or out parameter 'strClientId' inside an anonymous method,lambda expression or query expression
       timer.Elapsed += (sender, e) => Authenticates_Timer(sender, e,ref strClientId); 
       //timer.Elapsed += Authenticates_Timer();
       timer.Start(); 
    } 
    static void Authenticates_Timer(object sender, ElapsedEventArgs e, ref string strClientId)
    { 
      //want to use variable here 
      strClientId = "";
    }

如果有一种方法我可以在传递时使用 ref 变量 事件参数不能使用 ref 或 out 参数 'strClientId' 在匿名方法、lambda 表达式或查询中 expression.I 知道这是重复的问题,但我做不到 弄清楚如何解决这个问题已经引用了不同的帖子和 也在 codeproject 中发布了问题,但没有人回应 感谢帮助

我建议将 strClientId 共享为静态变量:

static BackgroundWorker worker; 
static string strClientId;
static void Main(string[] args) 
{ 
  worker = new BackgroundWorker();
  worker.DoWork += worker_DoWork; 
  worker.RunWorkerAsync();
  Console.ReadLine(); 
} 
static void worker_DoWork(object sender,DoWorkEventArgs e) 
{ 
  strClientId = "2211";
  Authenticate(); 
}
static void Authenticate() 
{
   Timer timer = new Timer(500); 
   timer.Elapsed += (sender, e) => Authenticates_Timer(sender, e); 
   timer.Start(); 
} 
static void Authenticates_Timer(object sender, ElapsedEventArgs e)
{ 
  strClientId = "";
}

它对你有用吗?

更新:好的,让我们试试这个:

static void worker_DoWork(object sender,DoWorkEventArgs e) 
{ 
  string strClientId = "";
  var setClientId = new Action<string>(v => { strClientId = v; });
  setClientId("2211");
  Authenticate(setClientId); 
}

static void Authenticate(Action<string> setClientId) 
{
  Timer timer = new Timer(500); 
  timer.Elapsed += (sender, e) => Authenticates_Timer(sender, e, setClientId); 
  timer.Start();    
}

static void Authenticates_Timer(object sender, ElapsedEventArgs e, Action<string> setClientId)
{ 
  setClientId("");
}

就这么简单:

static void Authenticate(ref string strClientId) 
{
       Timer timer = new Timer(500); 
       var strClientIdVar = strClientId;
       timer.Elapsed += (sender, e) => Authenticates_Timer(sender, e,ref strClientIdVar);
       timer.Start(); 
}