【发布时间】:2012-12-20 01:50:55
【问题描述】:
场景非常少见,但非常简单:定义一个泛型类,然后创建一个从外部类继承的嵌套类,并在嵌套中定义一个关联字段(self 类型)。代码 sn-p 比描述简单:
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 在这种情况下,类型在某些方面有所不同吗?
当事情变得非常棘手时
您可以查看以下课程的decompiled source code。它真的很大,总长度为 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
【问题讨论】:
-
你是用 DEBUG 还是 RELEASE 编译的?
-
@Tigran:Debug 和 Release 的结果是一样的。
-
虽然您的观察很有趣,但您的问题有点像“为什么
n^n增长如此之快?”。 -
+1,滥用泛型。
-
这确实是对泛型的严重滥用!我完全要为我的博客窃取这个例子。如果您喜欢这类事情,您可能会感兴趣的两篇文章是:blogs.msdn.com/b/ericlippert/archive/2007/07/27/… 和 blogs.msdn.com/b/ericlippert/archive/2008/05/07/…
标签: c# .net c#-4.0 generics nested