2016-08-01 9 views
1

Wir haben ein interessantes Problem aufgetreten, dass ich mich frage, ob jemand in der Lage sein wird, Licht zu werfen. Wir sehen derzeit die Warnung: "Method never reaches end or 'return' statement" auf einem Event-Handler-Delegat Callback, das eher ungerade ist.Unerreichbar Code Warnung im statischen EventHandler Callback

Betrachten Sie den folgenden Code (Sie können die SCB_ Funktionen ignorieren können, sie auf die Frage nicht relevant sind):

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; 
    } 

} 

Die Warnung ist auf EventQueue_AppExiting. Hier ist der seltsame Teil. Wenn ich die Aufhebung der Registrierung auszeichne, _eventQueue.AppExiting -= EventQueue_AppExiting, verschwindet die Warnung.

Wir haben eine Vielzahl von „Lösungen“ versucht, für das, was wie ein Fehler in der Unerreichbarkeit Pass des Compilers scheint:

  1. Machen Sie die statische Klasse, nicht-statische und entsprechend anpassen
  2. Fabrikat die event in UnityEngineQueue statisch, und entsprechend anpassen
  3. Legen Sie das Ereignis un-Anmeldung am Ende der Callback-Methode
  4. Kommentieren Sie die Anrufe an die voidSCB_ Funktionen zur Plausibilitätsprüfung
  5. Verschiedene andere Spaghetti at the wall Lösungen

der oben Alle ergab keine Änderung im Verhalten des Compilers. Unsere beste Vermutung ist, dass der Compiler die Aufhebung der Registrierung und denkt, dass, weil der Delegat entfernt wird, dass es die Ausführung zur Laufzeit nicht abschließen kann, obwohl ich glaube, dass der Stapel die Ausführung auch nach dem Entfernen fortgesetzt werden muss, weil der Aufruf bereits begonnen hatte.

Es scheint nicht so zu sein, als hätte dies negative Auswirkungen auf die Ausführung der Anwendung, es ist jedoch aufgrund der Art der Aufrufbedingungen des Ereignisses (Application Exiting) schwierig zu debuggen.

Was könnte der Compiler sehen und/oder was machen wir möglicherweise falsch?

P.S. Für ein bisschen Kontext ist die Klasse static, weil es als extern Brücke zu verschiedenen plattformspezifische Bibliotheken mit einem ähnlichen API wirkt. Aber diese Tatsache hat wenig mit der Frage zu tun, nur um die "EWWWW Static Class" -Stimmung zu unterdrücken.

+2

Es gibt genau * ein * Google Treffer für diese Fehlermeldung. Seltsam, dass du Xamarin nicht erwähnt hast. https://bugzilla.xamarin.com/show_bug.cgi?id=42819 –

+0

Guten Fang @HansPassant Ich wollte es zu Tags hinzufügen, aber es nicht geschafft. Wir haben nach dem Fehler gesucht, aber den Treffer, von dem Sie gesprochen haben, nicht gesehen. Suchbegriff war 'Methode erreicht nie Ende oder 'Rückkehr' Anweisung EventHandler'.Ich habe das Tag hinzugefügt. –

Antwort