场景非常罕见,但非常简单:定义一个泛型类,然后创建一个继承自外部类的嵌套类,并在嵌套内定义一个关联字段(自类型)。代码片段比描述更简单:
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
and Inner
在这种情况下,类型在某种程度上有所不同?
当事情变得非常棘手时
您可以看到反编译源代码 http://codepaste.net/6f63no对于下面的课程。它确实很大,总长度有 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
and Debug