6

为什么这个声明+赋值会导致错误:

// Use of unassigned local variable 'handler'.
SessionEndingEventHandler handler = (sender, e) => { isShuttingDown = true; SystemEvents.SessionEnding -= handler; };

虽然这不是:

SessionEndingEventHandler handler = null;
handler = (sender, e) => { isShuttingDown = true; SystemEvents.SessionEnding -= handler; };

直观地说,第一个语句应该会导致错误,但不能立即清楚为什么第二个语句不会。

此外,我如何判断SystemEvents.SessionEnding事件是否在调用后实际上已取消订阅handler(null, null)GetInvocationList唯一适用于代表。

SystemEvents.SessionEnding += handler;
handler(null, null);
4

1 回答 1

10

出于同样的原因,您期望这会失败:

int i = 1 - i;

语句的右侧在赋值之前被评估,而在它被评估的时候,变量还没有被赋值。

如果您认为 lambdas/delegates 改变了事情,请考虑以下语句:

int i = ((Action)() => 1 - i)();

因为您是在i分配之前创建 lambda,所以可能在分配任何值之前i就可以使用它。从编译器的角度来看,您不希望在您的情况下发生这种情况并不会改变事情——您必须在使用变量之前显式地为其赋值。如果它是一个空值,那么至少编译器知道你正在考虑当你得到它时它会为空的可能性。

关于你的最后一个问题,aSessionEndingEventHandler 代表。所以这可以正常工作:

var unsubscribed = SystemEvents.SessionEnding == null ||
    !SystemEvents.SessionEnding.GetInvocationList().Contains(handler);
于 2015-10-11T01:46:27.277 回答