我需要修复使用.NET 4反编译的C#代码。不幸的是,在我的工作站上只安装了.NET 3.5,这可能是以下代码无法编译的原因:
ReportPage.<>c__DisplayClass26 <>c__DisplayClass = new ReportPage.<>c__DisplayClass26();
什么&lt;&gt;建筑意味着什么? 除了这一行,代码中的任何地方都没有c__DisplayClass26字符串。这可能意味着此名称是由反编译期间遗漏的某些元信息构成的。
答案 0 :(得分:4)
C#编译器有时必须引入变量/字段/类。当他必须这样做时,他会将<>
添加到他们的名字前面,这样就不会发生名称冲突(使用C#编译器,用这两个字符命名是非法的)。例如,对于自动生成的属性,yield
关键字,lambda&amp;匿名函数/委托,新的async
关键字(在Async CTP中引入的关键字,可能会出现在C#5.0中)...
现在......奇怪的是,你只有c__DisplayClass26
。也许你的反编译器不符合标准。尝试使用IlSpy
查看代码。
看看这个pastebin:http://pastebin.com/pTRVyVdp(它不是我的)。 c__DisplayClass
有一个例子。在文本的前半部分有“原始”代码,在后半部分是反编译代码。你看,在这种情况下,它用于封闭。在第32/33行,有一个[CompilerGenerated] private sealed class <>c__DisplayClass2
。你的代码中也应该有它。
嗯...... IlSpy有点太好了:-)通常它能够从CompilerGenerated
代码重建“原始”代码。
答案 1 :(得分:4)
xanatos是正确的;您正在查看自动生成的类以实现闭包语义。
我解释C#编译器在代表你做某事时产生的神奇名字的方便指南在这里:
Where to learn about VS debugger 'magic names'
但我再次强调你不应该依赖于此;这仅用于娱乐目的。我们保留随时更改此计划的权利。
答案 2 :(得分:2)
这是一个编译器生成的类。它很可能是从ReportPage
类的方法中的匿名委托或lambda创建的。
您应该能够看到反编译代码中使用它的位置,并尝试弄清楚它正在做什么来支持它。