我们发生了一个有趣的问题,我想知道是否有人能够阐明这一点。我们目前看到警告:"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
警告就会消失。
我们已经尝试了各种“解决方案”来解决编译器无法访问过程中的错误:
- 将静态类设为非静态并进行相应调整
- 使
event
inUnityEngineQueue
静态,并进行相应调整 - 将事件注销放在回调方法的最后
- 注释掉
void
SCB_
对健全性检查功能的调用 - 其他各种
Spaghetti at the wall
解决方案
以上所有都没有改变编译器的行为。我们最好的猜测是编译器检测到注销并认为因为委托被删除了,所以它无法在运行时完成执行,尽管我相信即使在删除之后堆栈也必须继续执行,因为调用已经开始。
这似乎不会对应用程序的执行产生任何不利影响,但是由于事件调用条件(应用程序退出)的性质,很难调试。
编译器会看到什么和/或我们可能做错了什么?
P.S.
对于一些上下文,该类是static
因为它充当了extern
具有类似 API 的各种平台特定库的桥梁。但这个事实与问题无关,只是为了平息“EWWWW 静态类”的情绪。