如果A <T1,T2>是实际类型的模板,那么为什么允许使用typeof(A <,>)?

flo*_*ode 7 c# generics

class Program
{
    static void Main(string[] args)
    {
        Type t = typeof(A<,>);
        Console.WriteLine(typeof(A<,>)); // prints A'2[T1,T2]
    }    
}

class A<T1,T2>
{

}
Run Code Online (Sandbox Code Playgroud)

据我所知,泛型类型A<T1, T2>不是实际类型,而是实际类型的蓝图/模板,所以为什么typeof接受它作为参数(因为据我所知,typeof接受作为参数实际类型)?

谢谢

Eri*_*ert 4

反射中,未构造的泛型类型与实例类型C<>合并。 C<T>

这或许并不纯粹是理论上的。我认为这些是非常不同的实体。我认为一个是符号“带有一个类型参数的 C”,另一个是编译时类型 C<T>。在代码中,C<>C<T>不是彼此的同义词;如果 T 在范围内,则可以创建后一种类型的字段,但不能创建前一种类型的字段。

当您请求非构造类型时,反射库会为您提供实例类型的类型,但这并不全是坏事。您将如何处理非构造类型?你真的无能为力。但对于实例类型,您可以在这里说“用 int 代替 T”。

C<T>当您请求时获取的真正好处typeof(C<>)是,这总是为您提供非构造类型。比较:

class C<T>
{
    public static Type CT() { return typeof(C<T>); }
    public static Type JustC() { return typeof(C<>); }
}
Run Code Online (Sandbox Code Playgroud)

当您致电 CT 时,您会拨打什么电话?没有C<T>可以调用 CT 的类型。你可以打电话,C<int>.CT这种情况下你会回来C<int>,而不是C<T>。获得用 T 构造的类型的唯一方法C<>是请求typeof(C<>).

那有意义吗?

我还没有讨论反射(我对它是什么有一个模糊的概念)

反射只是一个代码库,它允许您在代码本身中获取有关代码的信息。“typeof”为您提供一个 Type 对象,然后您可以“反映”该对象以查找有关类型的信息。

我不确定我是否理解“即使 T 不在范围内”的意思

我说的方式令人困惑。我已经重新表述了。