从匿名函数返回值的内联语法是什么?

时间:2016-09-26 15:17:47

标签: c# unity3d lambda delegates coroutine

我在StackOverflow上查了很多类似的帖子,但由于我的lambda在Coroutine中,它们似乎没有接近我的问题。

我的代码:

public string FetchInternetItems()
    {

      WWW www = new WWW(someURL);

      StartCoroutine(WaitForRequest(www, callback => {

      if(!string.IsNullOrEmpty(callback))
      {
        Debug.Log("Successfully worked..");
      }
      else
      {
        return "Did not connect to remote server.";
      }

      }));

摘录自WaitForRequest

IEnumerator WaitForRequest(WWW www, Action<string> callback)
    {
        yield return www;

        if (string.IsNullOrEmpty(www.error))
        {
            if (callback != null)
            {
              callback(www.text);
            }
        }
        else
        {   
            Debug.Log("WWW Error: " + www.error);
        }
    }

可在此处找到协程类:https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html

返回错误:

Anonymous function converted to a void returning delegate cannot return a value

理想情况下,我希望它返回callback,除非没有任何内容,而是返回Did not connect to remote server.消息。

2 个答案:

答案 0 :(得分:4)

您的WaitForRequest - 方法的参数类型为Action<string>回调。 Action只是返回 nothing void)的方法的委托,因此您无法在此类委托中调用return ...。但无论如何你的设计似乎都被打破了。如果出现错误,你会返回一个字符串,如果一切正常,你想要返回WWW - 这个似乎有点矛盾的实例,不是吗?

您可以在发生错误时抛出异常而不是返回字符串:

IEnumerator WaitForRequest(WWW www, Action<string> callback)

您现在可以这样称呼:

StartCoroutine(WaitForRequest(www, callback => 
{
    if(!string.IsNullOrEmpty(callback))
    {
        Debug.Log("Successfully worked..");
    }
    else
    {
        throw new Exception("Did not connect to remote server.");
    }
}

这里的想法是,如果你无法连接到服务器,你的应用程序就无法继续正常工作,所以你可以带着例外离开。

答案 1 :(得分:1)

查看您的方法签名:

return "Did not connect to remote server.";

它希望你返回一个字符串。

不是从方法范围返回字符串,而是从匿名方法返回它。

FetchInternetItems()

上面这句话说你试图从匿名方法返回一个字符串,这不允许它导致跟随错误:

  

匿名函数转换为void返回委托不能   返回一个值

coroutine会在不等待WaitForRequest FetchInternetItems()完成的情况下结束执行。因此两个执行都没有相关。话虽如此,您将无法使用您在public void FetchInternetItems(Action<string> callBack); 中返回的响应字符串。

要解决此问题,一个简单的解决方案是将签名更改为

FetchInternerItems( result => { Debug.Log("This is response text from www : " + result);});

这就是你怎么称呼这个方法:

FetchInternerItems(OnCompleted);


void OnCompleted(string response)
{
    Debug.Log("This is response text from www: " + response);
    // You can do other stuff here...
}

或者像这样:

{{1}}

如果还有更多要知道的话。请在评论部分询问。希望这会有所帮助。

相关问题