【问题标题】:.NET: Why is nested class having generics declaring in outer class?.NET:为什么嵌套类在外部类中声明泛型?
【发布时间】:2019-02-22 14:56:23
【问题描述】:

因为 Type.FullName 有点难看,所以我需要制作我漂亮的名称构造函数。但是当我使用Type.GetGenericArguments() 时,我遇到了一个问题。

外部类C1 的通用T 始终分发给嵌套类C2 和C3。

class C1<T> {
    public class C2<T1, T2> {
    }
    public class C3 {
    }
}

typeof( C1<> ).ToString(); // C1`1[T]
typeof( C1<>.C2<,> ).ToString(); // C1`1+C2`2[T,T1,T2]
typeof( C1<>.C3 ).ToString(); // C1`1+C3[T]

两个问题:

  • 如何判断泛型类型是否来自外部类?
  • 这种行为的原因是什么?

【问题讨论】:

  • 至于第二个问题 - 对于外部类的每个特定泛型类型,您都有单独的嵌套类实例;例如,如果您在 C3 中声明 static 变量,则每种类型的 T 将是不同的实例;所以你确实有C3 参数化T
  • IEnumerable&lt;Type&gt; GetLocalGenericArguments(Type t) =&gt; !t.IsNested ? t.GetGenericArguments() : t.GetGenericArguments().Skip(t.DeclaringType.GetGenericArguments().Length);.

标签: c# .net cil


【解决方案1】:

类型参数不会被 CIL 中的嵌套类“继承”。在那里,您的课程如下所示:

.class private auto ansi beforefieldinit C1`1<T> extends [mscorlib]System.Object
{
    .class nested public auto ansi beforefieldinit C2`2<T, T1, T2> extends [mscorlib]System.Object
    {
    }

    .class nested public auto ansi beforefieldinit C3<T> extends [mscorlib]System.Object
    {
    }
}

由于嵌套类型的定义实际上并不依赖于父类型,因此它不需要访问外部泛型参数,因此决定必须像 C# 一样显式重复它们,但支持以不同方式工作的语言(C1&lt;&gt;.C3 可能是具体类型)。

然后,您的问题是从 .NET 类型获取 C# 类型表达式之一。您可能对CodeDOM 很幸运,或者只是假设如果嵌套类型的泛型参数与父类型的泛型参数名称相同,则可以在创建字符串时省略它们。

因此,重申一下,泛型参数不能来自 .NET 中的外部类,这仅仅是 C# 的行为。如果您假设该类是在 C# 中创建的,则可以简单地根据参数名称删除参数。

【讨论】:

  • 这里的措辞很混乱。
  • @Enigmativity 哪句话?
  • 说实话。我真的不明白你在说什么。这简直令人困惑。
  • 您不需要按名称匹配类型参数;如果父类型有 n 个类型参数,它们将是嵌套类型的第一个 n 个类型参数,并且顺序相同。
猜你喜欢
  • 2016-04-26
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 2012-12-20
  • 1970-01-01
相关资源
最近更新 更多