【问题标题】:Modify Func for out parameter [duplicate]修改输出参数的 Func [重复]
【发布时间】:2015-08-20 11:04:18
【问题描述】:

我有一个函数:

private static Response WaitForAPIReply(Func<Response> f)
{
  while (true)
  {
    var response = f();
    if (response.MISSING == "WAIT")
    {
      Console.WriteLine("WAIT");
      Thread.Sleep(TimeSpan.FromSeconds(0.1));
    }
    else
    {
      return response;
    }
  }
}

我称WaitForAPIReply为:

private static Response GetTestData(int a, string b)
{
  return WaitForAPIReply(() => GetData(a, b));
}

我想在GetData 中添加一个out 参数并在WaitForAPIReply 函数中使用它。但是我无法为此修改WaitForAPIReply
我在网上搜索可以看到我可以使用委托。但是当作为参数传递给WaitForAPIReply时我无法解决这个问题

【问题讨论】:

  • 所以你想让WaitForAPIReply 也有一个out 参数吗?那你想叫它WaitForAPIReply((out YourType o) =&gt; GetData(a, b, out o), out c);,还是什么?不清楚你的问题是什么?也许你想像private static Response WaitForAPIReply(YourOutFunc&lt;YourType, Response&gt; f, out YourType yt) { ... } 一样声明它。请指出您的问题所在。
  • @Jeppe,问题是我想在“WaitForAPIReply”函数中使用“GetData”的“out”参数中接收到的数据
  • 试试我在第一条评论中写的。您必须定义自己的“func”委托类型。它是这样的:namespace YourSpace { delegate TResult YourOutFunc&lt;TOut, out TResult&gt;(out TOut o); },您可以将其放入一个新文件YourOutFunc.cs。祝你好运。

标签: c#


【解决方案1】:

为什么要修改WaitForAPIReply?请注意,现在GetData 有两个参数,但它们不会在您的f() 调用中的任何地方使用WaitForAPIReplyout 参数应该在GetTestData 中的某处声明,以便您可以将其传递给GetData

// First approach
private static Response GetTestData(int a, string b)
{
    int c;
    return WaitForAPIReply(() => GetData(a, b, out c));
}

// Second approach
private static Response GetTestData(int a, string b, int c)
{
    return WaitForAPIReply(() => GetData(a, b, out c));
}

【讨论】:

  • 第二种方法令人困惑,第三种方法无法编译(幸运的是 - 无法保证 lambda 将在何时何地执行,如果有的话;这不是你想要的 outref 参数)。
  • @kapol,您的解决方案对于声明参数非常有用。但我想在“WaitForAPIReply”函数中使用“out c”。我错过了在我的问题中提到这一点,所以我正在编辑我的查询。
  • @Luaan 关于第三种方法的好点。我会将其从答案中删除。
猜你喜欢
  • 1970-01-01
  • 2023-02-23
  • 2019-11-03
  • 2019-12-16
  • 2016-05-30
  • 2011-05-16
  • 1970-01-01
  • 2021-10-01
  • 2020-10-02
相关资源
最近更新 更多