静态事件处理程序回调中无法访问的代码警告

Unreachable Code Warning in Static EventHandler callback

我们遇到了一个有趣的问题,我想知道是否有人可以解释一下。我们目前看到警告:"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,警告消失。

我们已经尝试了各种 "solutions" 来解决 看起来 像编译器无法访问通道中的错误:

  1. 使静态 class、非静态并相应调整
  2. UnityEngineQueue中的event设为静态,并相应调整
  3. 将事件取消注册放在回调方法的末尾
  4. 注释掉对 void SCB_ 函数的调用以进行完整性检查
  5. 各种其他 Spaghetti at the wall 解决方案

以上所有操作均未对编译器的行为产生任何影响。我们最好的猜测是编译器检测到注销并且 认为 因为委托被删除,它无法在运行时完成执行,即使我相信即使在之后堆栈也必须继续执行删除,因为调用已经开始。

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

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

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

我认为这是关于此 link 所报告的错误:

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

这里

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

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