This question already has answers here:
What are the differences between Generics in C# and Java… and Templates in C++? [closed]
                                
                                    (13个回答)
                                
                        
                        
                            C# generics compared to C++ templates [duplicate]
                                
                                    (5个答案)
                                
                        
                                6年前关闭。
            
                    
我知道在C ++中,泛型实际上并不存在,但是您可以使用template进行模拟。当您构建代码时,编译器会对代码进行预处理,并生成一个新代码,其中的通用值将替换为对象声明中指定的实际值,然后该新代码才真正被编译。例如,假设我们有一个类A,如下所示:

template<class T>
class A
{
    T f();
};


然后在代码的其他地方有A<int> a;。编译的实际代码为:

class A
{
    //Replaces T by int in the pre-processing
    int f();
};


整个介绍之后,让我们开始讨论。

我的问题是:


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

最佳答案

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

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

概括一下(摘自上面链接的MSDN文章):


C#泛型无法提供与C ++相同的灵活性
模板。例如,不可能调用算术运算
C#通用类中的运算符,尽管可以调用用户
定义的运算符。
C#不允许使用非类型的模板参数,例如template
C {}。
C#不支持显式专业化;也就是说,一个习惯
特定类型模板的实现。
C#不支持部分专业化:自定义实现
类型参数的子集。
C#不允许将type参数用作以下内容的基类
通用类型。
C#不允许类型参数具有默认类型。
在C#中,通用类型参数本身不能是通用类型,尽管
构造类型可以用作泛型。 C ++确实允许模板
参数。
C ++允许代码可能对其中的所有类型参数均无效
模板,然后检查用作模板的特定类型
类型参数。 C#要求将类中的代码编写为
它可以与满足约束的任何类型一起工作的方式。
例如,在C ++中,可以编写一个使用
类型参数对象上的算术运算符+和-
实例化模板时会产生错误
的类型不支持这些运算符。 C#不允许这样做;
唯一允许的语言结构是可以推论的语言结构
从约束。


通常,尽管它们共享相似的语法,并且在大多数情况下使用,但用法和功能却有许多较大差异。

10-08 08:23
查看更多