静态事件处理程序回调中无法访问的代码警告
Unreachable Code Warning in Static EventHandler callback
我们遇到了一个有趣的问题,我想知道是否有人可以解释一下。我们目前看到警告:"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
,警告消失。
我们已经尝试了各种 "solutions" 来解决 看起来 像编译器无法访问通道中的错误:
- 使静态 class、非静态并相应调整
- 将
UnityEngineQueue
中的event
设为静态,并相应调整
- 将事件取消注册放在回调方法的末尾
- 注释掉对
void
SCB_
函数的调用以进行完整性检查
- 各种其他
Spaghetti at the wall
解决方案
以上所有操作均未对编译器的行为产生任何影响。我们最好的猜测是编译器检测到注销并且 认为 因为委托被删除,它无法在运行时完成执行,即使我相信即使在之后堆栈也必须继续执行删除,因为调用已经开始。
这似乎不会对应用程序的执行产生任何不利影响,但由于事件调用条件(应用程序退出)的性质,很难调试。
编译器会看到什么and/or我们可能做错了什么?
P.S.
对于一些上下文,class 是 static
,因为它充当 extern
桥接各种具有类似 API 的特定于平台的库。但这个事实与问题无关,只是为了平息 "EWWWW Static Class" 情绪。
我认为这是关于此 link 所报告的错误:
https://bugzilla.xamarin.com/show_bug.cgi?id=42819
这里
https://bugzilla.xamarin.com/show_bug.cgi?id=41798
他们报告在版本 6.2.0.259 中已修复
我们遇到了一个有趣的问题,我想知道是否有人可以解释一下。我们目前看到警告:"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
,警告消失。
我们已经尝试了各种 "solutions" 来解决 看起来 像编译器无法访问通道中的错误:
- 使静态 class、非静态并相应调整
- 将
UnityEngineQueue
中的event
设为静态,并相应调整 - 将事件取消注册放在回调方法的末尾
- 注释掉对
void
SCB_
函数的调用以进行完整性检查 - 各种其他
Spaghetti at the wall
解决方案
以上所有操作均未对编译器的行为产生任何影响。我们最好的猜测是编译器检测到注销并且 认为 因为委托被删除,它无法在运行时完成执行,即使我相信即使在之后堆栈也必须继续执行删除,因为调用已经开始。
这似乎不会对应用程序的执行产生任何不利影响,但由于事件调用条件(应用程序退出)的性质,很难调试。
编译器会看到什么and/or我们可能做错了什么?
P.S.
对于一些上下文,class 是 static
,因为它充当 extern
桥接各种具有类似 API 的特定于平台的库。但这个事实与问题无关,只是为了平息 "EWWWW Static Class" 情绪。
我认为这是关于此 link 所报告的错误:
https://bugzilla.xamarin.com/show_bug.cgi?id=42819
这里
https://bugzilla.xamarin.com/show_bug.cgi?id=41798
他们报告在版本 6.2.0.259 中已修复