为什么C#generics的专业化有限?

问题是“什么是具体化?” 评论C#的generics:

维护类型信息,通过使用reflection检查类型参数,允许在一定程度上进行特化。 但是, 由于在任何具体化发生之前编译generics类型定义 (这是通过根据类型参数的约束编译定义来完成的 – 因此,编译器必须能够,因此专业化程度是有限的。即使在没有特定类型参数的情况下,“理解”该定义)。

  • “专业化”是什么意思? 它与具有特定类型参数的generics类型的实例化不同吗?

  • “专业化程度有限”是什么意思?

  • 为什么它“是在任何具体化发生之前编译generics类型定义的结果”?

“专业化”是什么意思? 它与具有特定类型参数的generics类型的实例化不同吗?

作者在他致力于Javagenerics的部分答案中解释说

generics类型的特化[是]能够为任何特定的generics参数组合使用专门的源代码。

换句话说,如果generics类型参数属于特定类型,则它能够执行特殊操作。 当您将类型实例化为List时,提供List的实现(将单个元素表示为位)将是特化的示例。

“专业化程度有限”是什么意思?

作者意味着虽然你可以写像

 if (typeof(T) == typeof(bool)) { ... } 

您对类型参数组合的响应能力是有限的,因为对类型组合的任何决定都必须在运行时进行。

为什么它“是在任何具体化发生之前编译generics类型定义的结果”?

因为在C#编译器不在图片之后,在CLR中完成了validation。 编译器必须为CLR生成generics类型定义,以用作“模板”,以便为generics类的实例创建闭合的构造类型。

我相信其含义如下:

当您定义generics类型,例如MyGenericType您的定义必须对T的任何值有意义,因为generics类型是在您在特定实现中实际使用它之前编译的(“专业化程度有限,因此在任何具体化发生之前编译generics类型定义的事实“)。

稍后,当您实际使用MyGenericType ,编译器/ jit将创建一个新类,它几乎是MyGenericType ,每次提到的T替换为int 。 这是具体化的过程。 这意味着在运行时,您可以使用generics类型使用int的事实,但是您使用此(特化)的能力是有限的,因为当您定义MyGenericType您不知道这一点。

专业化被用作泛化的反义词。 创建generics类型时,可以推广类型定义。 使用类型初始化它时,您专门编译的generics类型能够在运行时创建该类型的对象。

IL编译generics类型。 在运行时,此编译的generics类型与特定的类型参数组合以生成指定类的对象。

是的,专门化与在运行时使用特定类型参数的generics类型的实例化相同。

使用generics, 来约束基本上修复了generics类型的范围 。 您可以通过定义T可以是结构,类或必须具有某些特定的基类等来判断。您无法创建通用类型上定义的约束不允许的类实例。

如果它满足generics类中的约束,则可以使用int,string或其他类初始化相同的generics类型定义。 它不能用T直接创建类的对象,还没有被定义的类型(原始类型,如int,string或您的自定义类或接口)替换,并且您的代码内部应该与作为T传入的类型兼容上class。

请参阅(您在上面提到的同一问题的链接):

NETgenerics和代码膨胀

generics不是模板(如在C ++中)