Rah*_*han 6 .net c# variables delegates unassigned-variable
为什么这个声明+赋值会导致错误:
// Use of unassigned local variable 'handler'.
SessionEndingEventHandler handler = (sender, e) => { isShuttingDown = true; SystemEvents.SessionEnding -= handler; };
Run Code Online (Sandbox Code Playgroud)
虽然这不是:
SessionEndingEventHandler handler = null;
handler = (sender, e) => { isShuttingDown = true; SystemEvents.SessionEnding -= handler; };
Run Code Online (Sandbox Code Playgroud)
直观地说,第一个语句应该导致错误但不能立即清楚为什么第二个语句不是.
此外,SystemEvents.SessionEnding在调用之后,如何判断事件是否实际上已取消订阅handler(null, null)?该GetInvocationList只适用于委托.
SystemEvents.SessionEnding += handler;
handler(null, null);
Run Code Online (Sandbox Code Playgroud)
Str*_*ior 10
出于同样的原因,你预计会失败:
int i = 1 - i;
Run Code Online (Sandbox Code Playgroud)
在赋值之前评估语句的右侧,并且在评估时,尚未分配变量.
如果您认为lambdas/delegates改变了事情,请考虑以下语句:
int i = ((Action)() => 1 - i)();
Run Code Online (Sandbox Code Playgroud)
因为你之前创建拉姆达i分配,这可能是i之前的任何值已被分配给它可以被使用.事实上,你不要指望,以你的情况发生不会从编译器的角度改变的事情-你必须使用数据之前的值明确分配给变量.如果它是一个空值,那么至少编译器知道你正在考虑它到达它时它将为null的可能性.
关于你的最后一个问题,a SessionEndingEventHandler 是代表.所以这样可以正常工作:
var unsubscribed = SystemEvents.SessionEnding == null ||
!SystemEvents.SessionEnding.GetInvocationList().Contains(handler);
Run Code Online (Sandbox Code Playgroud)