4

有人可以给我一个雄辩的,深入的解释为什么可以这样:

EventHandler e;

private void foobar(){
     e = new EventHandler((o, s) => {
           somectl.LayoutUpdated -= e;
     }
     somectl.LayoutUpdated += e;
}

但这不是:

private void foobar(){
     EventHandler e = new EventHandler((o, s) => {
           somectl.LayoutUpdated -= e;
     }
     somectl.LayoutUpdated += e;
}

这也不是:

private void foobar(){
    EventHandler e;
    e = new EventHandler((o, s) => {
          somectl.LayoutUpdated -= e;
    }
    somectl.LayoutUpdated += e;
}
4

3 回答 3

2

最后两个不会编译,因为e在完成分配之前您无法引用。

第一个有效,因为此限制不适用于字段。

您可以通过将其分配给null第一个来使最后一个工作,这样它就会被明确分配。

EventHandler e = null;
e = (o, s) => {
      somectl.LayoutUpdated -= e;
};
somectl.LayoutUpdated += e;
于 2012-04-12T14:15:11.977 回答
2

这与 lambda 的关系比您想象的要少。例如,这将失败:

int i = i + 1;

就像这样:

int i;
if (condition) {i = 0;}
i = i + 1;

或者:

int i;
if (condition) {Console.WriteLine(i);}
i = 1;

lambda 表达式失败的原因相同:中间一个是因为你不能在它的声明中引用任何变量,最后一个是因为你不能保证e在你尝试在 lambda 中使用它之前已经初始化了它。

第一个示例运行良好,因为字段总是被初始化。它们要么在类的构造函数中被赋予一个值,要么它们将自动设置为默认值。如果你想在方法的范围内进行这项工作,你只需要在声明它时分配你的变量。

private void foobar(){
    EventHandler e = null;
    e = new EventHandler((o, s) => {
          somectl.LayoutUpdated -= e;
    }
    somectl.LayoutUpdated += e;
}
于 2012-04-12T14:18:06.023 回答
0

在最后两种情况下,编译器可以检查您是否正在使用 lambda 中未分配的局部变量。在第一种情况下,由于全局变量,编译器无法检查这一点。

于 2012-04-12T14:19:06.777 回答