2016-08-01 103 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'。我已經添加了標籤。 –

回答