为什么C#泛型的设计与C ++模板的行为有如此不同?

时间:2011-08-26 08:51:16

标签: c# .net c++ templates generics

我已经注意到了C# generics are quite different from C++ templates。我已经阅读了this question并回答了它,并对差异有了基本的了解。

但是我不明白设计差异的原因。我的意思是C ++在设计C#时已经非常发达。在C ++模板中,C#开发人员没有克隆C ++模板但是在泛化程度如此大不同的情况下是不是最理想的?

泛型可以做什么C ++模板不能做什么?什么是C#泛型比C ++模板更好?设计C#泛型的行为与C ++模板的不同之处是什么?

3 个答案:

答案 0 :(得分:4)

原因是一个是模板而另一个不是。听起来有多余?部分是因为你问了一个问题oalong“为什么汽车与飞机不同”。

模板是一种非常复杂的机制,很少使用大部分的强制性。我想你真的不知道模板可以做什么 - 只有25%的C ++模板人们每天都在使用。这是主要问题 - 它们太过于复杂。编译器很难。

因此,泛型应该为最常见的模板使用采用不同的方法,这是通用的一般类型(例如,没有专业化)。

  

泛型可以做什么C ++模板不能做什么?

没有

  

设计C#泛型的行为与C ++模板的不同之处是什么?

事实上C ++泛型很难被任何人掌握,而且很难为编译器正确实现,而且大多数都没有使用过。

答案 1 :(得分:4)

它完全不同的主要原因。

在编译时评估C ++模板 C#泛型在运行时进行评估。

此外,c ++模板很复杂。在开发C#时,他们决定降低模板的复杂性。用户和运行时评估实现。

答案 2 :(得分:1)

  

泛型可以做什么C ++模板不能做什么?

  • 泛型具有实例化类型的运行时信息。这对于内省(反射)和使用它的设备很有用;
  • C#4.0上的泛型支持接口和委托类型的协方差和逆变。因此,举个例子,IENumerable<Derived>可以在IEnumerable<Class>被请求时使用,其中Derived继承自Class