C# .NET:为什么嵌套类在外部类中声明泛型?

C# .NET:为什么嵌套类在外部类中声明泛型?,c#,.net,cil,C#,.net,Cil,因为Type.FullName有点难看,我需要创建一个漂亮的名称构造函数。但是当我使用Type.GetGenericArguments时,我遇到了一个问题 外部类C1的泛型T始终分布到嵌套类C2和C3 两个问题: 如何确定泛型类型是否来自外部类? 这种行为的原因是什么? CIL中的嵌套类不会继承类型参数。在这里,您的类看起来像这样: .class private auto ansi beforefieldinit C1`1<T> extends [mscorlib]System.Ob

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

外部类C1的泛型T始终分布到嵌套类C2和C3

两个问题:

如何确定泛型类型是否来自外部类? 这种行为的原因是什么?
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.C3可以是具体类型

然后,您的问题是从.NET类型获取C类型表达式。如果嵌套类型的泛型参数与父类型的泛型参数具有相同的名称,则可以在创建字符串时忽略它们


因此,重申一下,泛型参数不能来自.NET中的外部类,这仅仅是C的行为。如果您假定类是在C中创建的,那么只需根据其名称删除参数。

类型参数不会被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.C3可以是具体类型

然后,您的问题是从.NET类型获取C类型表达式。如果嵌套类型的泛型参数与父类型的泛型参数具有相同的名称,则可以在创建字符串时忽略它们


因此,重申一下,泛型参数不能来自.NET中的外部类,这仅仅是C的行为。如果您假定该类是用C创建的,那么您只需根据其名称删除参数。

至于第二个问题,对于外部类的每个特定泛型类型,您都有单独的嵌套类实例;例如,如果您在C3中声明静态变量,那么对于每种类型的T,它将是不同的实例;因此,您确实已经通过TIEnumerable GetLocalGenericArgumentsType t=>参数化了C3!t、 是嵌套的吗?t、 GetGenericArguments:t.GetGenericArguments.Skipt.DeclaringType.GetGenericArguments.Length。至于第二个问题——对于外部类的每个特定泛型类型,都有单独的嵌套类实例;例如,如果您在C3中声明静态变量,那么对于每种类型的T,它将是不同的实例;因此,您确实已经通过TIEnumerable GetLocalGenericArgumentsType t=>参数化了C3!t、 是嵌套的吗?t、 GetGenericArguments:t.GetGenericArguments.Skipt.DeclaringType.GetGenericArguments.Length。这里的措辞很混乱。@Enigmativity哪句话?老实说,所有这些都是真的。你说的大部分我真的不明白。这很容易混淆,你不需要按名称匹配类型参数;如果父类型有n个类型参数,则它们将是嵌套类型的前n个类型参数,且顺序相同。此处的措辞非常混乱。@Enigmativity哪个句子?老实说,它们都是。你说的大部分我真的不明白。这很容易混淆,你不需要按名称匹配类型参数;如果父类型有n个类型参数,则它们将是嵌套类型的前n个类型参数,且顺序相同。