我们遇到了一个有趣的问题,我想知道是否有人能够阐明。我们目前看到警告:"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'。我已经添加了标签。 –