C#中的泛型是否与C++中的相同?

eca*_*ver 0 c# c++ generics

我知道在C++中,泛型实际上并不存在,但你可以使用它来模拟它template.构建代码时,编译器预处理代码并生成一个新代码,其中通用值替换为对象声明中指定的实际值,然后是真正编译的新代码.例如,假设我们有A如下类:

template<class T>
class A
{
    T f();
};
Run Code Online (Sandbox Code Playgroud)

然后在我们的代码中的其他地方A<int> a;.编译的实际代码是:

class A
{
    //Replaces T by int in the pre-processing
    int f();
};
Run Code Online (Sandbox Code Playgroud)

在整个介绍之后,让我们谈谈.

我的问题是:

  • C#是否像C++一样对待泛型?如果没有,那怎么样?
  • 他们是特殊类型吗?
  • 它们是在运行时还是在编译时解决的?
  • 激活寄存器中的泛型类型保留了多少空间?

Ini*_*eer 6

这是一个非常广泛的主题,可以通过以下方式更好地解释:

http://msdn.microsoft.com/en-us/library/c6cyy67b.aspx

要sumarize(从上面链接的MSDN文章):

  • C#泛型不提供与C++模板相同的灵活性.例如,虽然可以调用用户定义的运算符,但不可能在C#泛型类中调用算术运算符.

  • C#不允许非类型模板参数,例如模板C {}.

  • C#不支持显式专业化; 也就是说,特定类型的模板的自定义实现.

  • C#不支持部分特化:类型参数子集的自定义实现.

  • C#不允许将type参数用作泛型类型的基类.

  • C#不允许类型参数具有默认类型.

  • 在C#中,泛型类型参数本身不能是通用的,尽管构造的类型可以用作泛型.C++确实允许模板参数.

  • C++允许对模板中的所有类型参数可能无效的代码,然后检查用作类型参数的特定类型.C#要求类中的代码以这样的方式编写,即它将适用于满足约束的任何类型.例如,在C++中,可以编写一个函数,该函数在类型参数的对象上使用算术运算符+和 - ,这将在使用不支持这些运算符的类型实例化模板时产生错误.C#不允许这样做; 允许的唯一语言结构是可以从约束中推导出的结构.

通常,虽然它们在大多数情况下共享相似的语法和用法,但在使用和功能方面存在许多巨大差异.

  • 这是一个很好的答案和一个很好的参考,但[你可以更好地回答](http://meta.stackexchange.com/q/8259),包括更完整的链接内容摘要.这样,当微软不可避免地重新组织MSDN库并打破所有链接时,我们仍然可以在这里找到答案. (4认同)