2
这个对象生存期延长关闭是C#编译器错误吗?
我当时回答的问题有关闭的可能(合法)扩展对象的生命周期,当我遇到了一些非常奇怪的代码生成的C#编译器的部分(4.0,如果该事项)。 我能找到的最短的再现是: 创建一个lambda来捕获本地,同时调用包含类型的 静态方法。 将生成的委托引用分配给包含对象的实例字段。 结果:编译器在没有理由的情况下创建了一个引用创建lambda的对象的闭包对象-委托的“内部”目标是静态方法,而lambda-createing对象的实例成员不需要执行委托时(不被)触碰。实际上,编译器的行为就像程序员this无故捕获的一样。 class Foo { private Action _field; public void InstanceMethod() { var capturedVariable = Math.Pow(42, 1); _field = () => StaticMethod(capturedVariable); } private static void StaticMethod(double arg) { } } 从发行版本生成的代码(反编译为“简单” C#)看起来像这样: public void InstanceMethod() { <>c__DisplayClass1 CS$<>8__locals2 = new <>c__DisplayClass1(); CS$<>8__locals2.<>4__this = this; // …