1

我们发生了一个有趣的问题,我想知道是否有人能够阐明这一点。我们目前看到警告:"Method never reaches end or 'return' statement"在一个相当奇怪的事件处理程序委托回调上。

考虑以下代码(您可以忽略这些SCB_功能,它们与问题无关):

public static class NativeBridge
{
    private static UnityEventQueue _eventQueue;
    private static bool _initialized;

    public static void Init() 
    {
        if (_initialized)
        {
            return;
        }
        _initialized = true;
        SCB_SDKInit();
        _eventQueue = UnityEventQueue.Instance;
        _eventQueue.AppExiting += EventQueue_AppExiting;
        SCB_registerReceivedSistrCallback(SistrReceived);
    }

    //Lots of other irrelevant code

    private static void EventQueue_AppExiting(object sender, EventArgs e)
    {
        SCB_registerReceivedSistrCallback(null);
        _eventQueue.AppExiting -= EventQueue_AppExiting;
        SCB_SDKFinal();
        _initialized = false;
    }

}

警告已开启EventQueue_AppExiting。这是奇怪的部分。如果我注释掉注销,_eventQueue.AppExiting -= EventQueue_AppExiting警告就会消失。

我们已经尝试了各种“解决方案”来解决编译器无法访问过程中的错误:

  1. 将静态类设为非静态并进行相应调整
  2. 使eventinUnityEngineQueue静态,并进行相应调整
  3. 将事件注销放在回调方法的最后
  4. 注释掉void SCB_对健全性检查功能的调用
  5. 其他各种Spaghetti at the wall解决方案

以上所有都没有改变编译器的行为。我们最好的猜测是编译器检测到注销并认为因为委托被删除了,所以它无法在运行时完成执行,尽管我相信即使在删除之后堆栈也必须继续执行,因为调用已经开始。

这似乎不会对应用程序的执行产生任何不利影响,但是由于事件调用条件(应用程序退出)的性质,很难调试。

编译器会看到什么和/或我们可能做错了什么?

P.S. 对于一些上下文,该类是static因为它充当了extern具有类似 API 的各种平台特定库的桥梁。但这个事实与问题无关,只是为了平息“EWWWW 静态类”的情绪。

4

1 回答 1

0

我认为这是此链接上报告的错误:

https://bugzilla.xamarin.com/show_bug.cgi?id=42819

和这里

https://bugzilla.xamarin.com/show_bug.cgi?id=41798

他们报告在版本 6.2.0.259 中已修复

于 2016-08-18T07:37:23.483 回答