C#:泛型类中的嵌套类是否应该被认为是通用的?

Cod*_*ler 10 c# generics reflection

namespace GenericsTest
{
    public class AGenericClass<T>
    {
        public class NestedNonGenericClass
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,应该NestedNonGenericClass算是一个泛型类?

反射API说它是一个泛型类,甚至把包含类的模板参数作为嵌套类的模板参数.

Type nestedClass = typeof(AGenericClass<int>.NestedNonGenericClass);
Console.Out.WriteLine("IsGeneric: {0}\tHasGenericArguments: {1}", 
   nestedClass.IsGenericType, nestedClass.GetGenericArguments().Length > 0);
Run Code Online (Sandbox Code Playgroud)

打印出:

IsGeneric:True HasGenericArguments:True

我不完全同意这种行为.即使编译器为其生成泛型类型NestedNonGenericClass,我也想知道它是否是通用的,因为它是声明的,或者因为它的容器是通用的.

所以,我的问题是:

首先,你认为可以考虑嵌套类泛型,因为它的容器是通用的吗?为什么/为什么不呢?

其次,您是否碰巧知道其他一些API可以帮助我只识别声明为通用的类?

PS:我在ECMA规范中找不到与此相关的任何内容(或者我可能只是掩盖它).

- 编辑 -

为了添加更多的上下文,我正在开发一种代码生成器.我正在使用反射API来确定类型是否是通用的.

我遇到了一个问题Dictionary<TKey, TValue>.KeyCollection.

因为KeyCollection,反射API说它是通用的并且把我交给我,TKey并且TValue在容器中声明了它们.因此,发电机最终产生Dictionary<TKey, TValue>.KeyCollection<Tkey, TValue>

我能解决这个问题的唯一方法是将嵌套类的模板参数与容器匹配,并消除所有匹配的模板参数.但我想知道是否有更好的方法.

Mar*_*ell 19

简而言之,是 - 一个类型从包含它的任何类型继承类型参数:这是类似事物的关键List<T>.Enumerator和许多其他场景等 - 它们T与外部类(不仅仅是任何T)共享是至关重要的.

ECMA参考文献是§25.1:

嵌套在泛型类声明或泛型结构声明(第25.2节)中的任何类本身都是泛型类声明,因为应提供包含类型的类型参数以创建构造类型.


Dyl*_*tie 6

是的,您的嵌套类绝对是通用的,因为T绑定到嵌套类的任何实例范围内的类型(这称为封闭泛型).

using System;
using System.Collections.Generic;

public class AGenericClass<T> {
    public class NestedNonGenericClass {
        public void DoSomething() {
            Console.WriteLine("typeof(T) == " + typeof(T));
        }
    }
}

public class MyClass {
    public static void Main()   {
        var c = new AGenericClass<int>.NestedNonGenericClass();
        var d = new AGenericClass<DateTime>.NestedNonGenericClass();
        c.DoSomething();
        d.DoSomething();
        Console.ReadKey(false); 
    }

}
Run Code Online (Sandbox Code Playgroud)

DoSomething()根据泛型类型的关闭方式,相同的方法产生不同的输出 - 所以是的,内部类肯定表现出通用行为.