2016-08-01 100 views
1

我们遇到了一个有趣的问题,我想知道是否有人能够阐明。我们目前看到警告:"Method never reaches end or 'return' statement"对事件处理程序委托回调很奇怪。静态EventHandler回调中无法访问的代码警告

考虑下面的代码(可以忽略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. 制作所述eventUnityEngineQueue静态的,并且相应地调整
  3. 放置事件未登记在回调方法
  4. 注释出到呼叫的结束SCB_功能完整性检查
  5. 其他各种Spaghetti at the wall解决方案

上述所有产生的编译器的行为没有变化。我们最好的猜测是,编译器检测到注销并且认为因为委托被移除,即使在运行时它不能完成执行,即使我相信堆栈因为调用已经开始而必须继续执行也是如此。

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

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

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

+2

有正好*一个*谷歌命中这个错误信息。奇怪你没有提到使用Xamarin。 https://bugzilla.xamarin.com/show_bug.cgi?id=42819 –

+0

好赶上@HansPassant我打算把它添加到标签,但没有这样做。我们确实搜索了这个错误,但没有看到你所说的这个命中。搜索词是'方法永远不会结束或'返回'语句EventHandler'。我已经添加了标签。 –

回答