静态EventHandler回调中无法访问的代码警告

时间:2016-08-01 16:51:14

标签: c# xamarin eventhandler unreachable-code

我们有一个有趣的问题,我想知道是否有人能够阐明。我们目前看到警告:"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. 使event中的UnityEngineQueue成为静态,并进行相应调整
  3. 在回调方法结束时将事件取消注册
  4. 注释掉对void SCB_功能的调用以进行完整性检查
  5. 各种其他Spaghetti at the wall解决方案
  6. 以上所有内容都没有改变编译器的行为。我们最好的猜测是编译器检测到注销,认为,因为代理被删除,它无法在运行时完成执行,即使我相信堆栈即使在删除后也必须继续执行,因为调用已经开始了。

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

    编制者可以看到什么和/或我们可能做错了什么?

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

1 个答案:

答案 0 :(得分:0)

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

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

在这里

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

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