我們遇到了一個有趣的問題,我想知道是否有人能夠闡明。我們目前看到警告:"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
,警告消失。
我們已經嘗試了什麼似乎像編譯器不可達通的錯誤各種各樣的「解決方案」的:
- 讓靜態類,非靜態,並相應地調整
- 製作所述
event
在UnityEngineQueue
靜態的,並且相應地調整 - 放置事件未登記在回調方法
- 註釋出到呼叫的結束
SCB_
功能完整性檢查 - 其他各種
Spaghetti at the wall
解決方案
上述所有產生的編譯器的行爲沒有變化。我們最好的猜測是,編譯器檢測到註銷並且認爲因爲委託被移除,即使在運行時它不能完成執行,即使我相信堆棧因爲調用已經開始而必須繼續執行也是如此。
似乎這不會對應用程序的執行產生任何不利影響,但由於事件調用條件(應用程序退出)的性質而難以調試。
編譯器會看到什麼和/或我們可能做錯了什麼?
P.S.
對於位上下文,類是static
因爲它充當一個extern
橋各種平臺特定的庫用類似的API。但這個事實與這個問題無關,只是爲了平息「EWWWW Static Class」情緒。
有正好*一個*谷歌命中這個錯誤信息。奇怪你沒有提到使用Xamarin。 https://bugzilla.xamarin.com/show_bug.cgi?id=42819 –
好趕上@HansPassant我打算把它添加到標籤,但沒有這樣做。我們確實搜索了這個錯誤,但沒有看到你所說的這個命中。搜索詞是'方法永遠不會結束或'返回'語句EventHandler'。我已經添加了標籤。 –