【问题标题】:Cannot use use ref or out parameter for anonymous methods不能对匿名方法使用使用 ref 或 out 参数
【发布时间】:2015-08-01 02:54:43
【问题描述】:
    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 表达式或查询中 表达。我知道这是重复的问题,但我无法 弄清楚如何解决这个问题已经引用了不同的帖子和 在 codeproject 中也发布了问题,但没有人回应 感谢您的帮助

【问题讨论】:

  • 你总是可以创建一个类,它有一个字段来保存客户 ID。然后传递一个类的实例。

标签: c# c#-4.0


【解决方案1】:

我建议将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("");
}

【讨论】:

  • 我知道我可以使用静态,但我的团队负责人说不要使用静态。
  • 改变的值是否也能反映在dowork事件中
  • 我想是的。该操作实际上是一个闭包,因此您几乎可以在当前 AppDomain 的任何位置传递对它的引用,并且它应该可以工作。
  • 你能详细说明我如何在dowork中使用action setClientId,这对老板很有帮助
  • 我已将示例添加到答案中。
【解决方案2】:

就这么简单:

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(); 
} 

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2021-10-28
    • 2010-11-24
    • 2010-11-03
    相关资源
    最近更新 更多