场景非常少见,但非常简单:定义一个泛型类,然后创建一个从外部类继承的嵌套类,并在嵌套中定义一个关联字段(self 类型)。代码片段比描述更简单:
class Outer<T>
{
class Inner : Outer<Inner>
{
Inner field;
}
}
反编译 IL 后,C# 代码如下所示:
internal class Outer<T>
{
private class Inner : Outer<Outer<T>.Inner>
{
private Outer<Outer<T>.Inner>.Inner field;
}
}
这似乎很公平,但是当您更改字段的类型声明时,事情变得更加棘手。所以当我将字段声明更改为
Inner.Inner field;
反编译后,该字段将如下所示:
private Outer<Outer<Outer<T>.Inner>.Inner>.Inner field;
我理解,类“嵌套”和继承并不能很好地相处,但为什么我们会观察到这种行为呢? Inner.Inner
类型声明是否完全改变了类型 ?Inner.Inner
在这种情况下,和类型 是否Inner
有所不同?
当事情变得非常棘手时
你可以看到下面这个类的反编译源代码。它真的很大,总长度为 12159 个符号。
class X<A, B, C>
{
class Y : X<Y, Y, Y>
{
Y.Y.Y.Y.Y.Y y;
}
}
最后,这个类:
class X<A, B, C, D, E>
{
class Y : X<Y, Y, Y, Y, Y>
{
Y.Y.Y.Y.Y.Y.Y.Y.Y y;
}
}
结果27.9 MB (29,302,272 bytes)
组装和Total build time: 00:43.619
使用的工具
编译在 C# 5 和 C# 4 编译器下完成。反编译由 dotPeek 完成。构建配置:Release
和Debug