为什么C#generics不能从C ++模板中的genericstypes参数中派生出来?

为什么C#generics不能从C ++模板中的genericstypes参数中派生出来? 我的意思是我知道这是不可能的,因为CLR不支持这个,但为什么?

我意识到C ++模板和C#generics之间的巨大差异 – 前者是编译时实体,必须在编译期间解决,而后者是一stream的运行时实体。

尽pipe如此,我仍然没有看到CLRdevise者为什么没有提出一个最终能够从一个genericstypes参数中派生出一个CLRgenericstypes的scheme。 毕竟,这将是非常有用的function,我个人非常想念它。

编辑:

我想知道一个核心问题,即解决这个问题,实现这个function的价格如此之高,以至于目前还没有落实。 例如,检查这个虚构的声明:

class C<T> : T { } 

正如Eric Lippert所注意到的,如果“ 如果T是一个结构怎么办?如果T是一个封闭的types,该怎么办?如果T是一个接口types,该怎么办?如果T是C,该怎么办?如果T是一个具有抽象方法的抽象types?如果T比C具有更less的可访问性?如果T是System.ValueType?(可以有一个从System.ValueTypeinheritance的非结构体吗?)System.Delegate, System.Enum,等等?

正如Eric继续说的那样,“ 那些简单而明显的 ”。 的确,他是对的。 我感兴趣的是一个既不容易也不明显的问题的具体例子,这个问题很难解决。

那么,首先问自己可能会出现class C<T> : T { } 。 大量的事情马上就会想起来:

如果T是一个结构呢? 如果T是密封的types,该怎么办? 如果T是一个接口types呢? 如果T是C<T>呢? 如果T是从C<T>派生的类,那该怎么办? 如果T是一个具有抽象方法的抽象types呢? 如果T比C更less可访问性呢? 如果T是System.ValueType呢? (你可以有一个从System.ValueTypeinheritance的非结构?)那么System.Delegate,System.Enum等呢?

这些是简单明了的。 所提出的function几乎可以打开数百个甚至数千个关于types与其基本types之间的相互作用的更微妙的问题,所有这些都必须被仔细地指定,实施和testing。 我们无疑会错过一些,从而导致未来发生重大变化,或者使用实现定义的行为为运行时带来麻烦。

成本将是巨大的,所以好处是巨大的。 我在这里看不到很大的好处。

好的,如果你不喜欢我以前的回答,那么让我们采取一个不同的方法。

你的问题假设是假的:我们需要一个理由 实施一个function。 相反,我们需要一个非常好的理由来实现任何function。 在前期成本,维护成本和机会成本方面,function非常昂贵。 (也就是说,花费在特性X上的时间是您不能花费在特性Y上的时间,而这可能会阻止您执行特性Z.)为了负责任地为我们的客户和利益相关者提供价值,我们无法实现每个特性有人喜欢。

运行时devise师不能certificate他们为什么没有实现一个你觉得特别好的function。 function是根据成本和用户的利益来确定优先级的,而用户并没有严格要求这种inheritance。 这个特殊的function将大大地改变types系统的分析在运行时中的工作方式,对每一种消费generics的语言都有深远的影响,而且在我看来,这样做的好处并不大。

我们在编译器中使用这种inheritance – 用C ++编写,所产生的代码难以遵循,很难维护,而且难以debugging。 我一直在尽我所能逐渐消除这样的代码。 我反对在C#中使用相同的不良模式,除非这样做有非常显着的好处。

以令人信服的方式描述这种巨大利益的任务,是要求那些想要这个特征的人,而不是要实施它的人。 那么有什么吸引人的好处呢?

代码的例子,这可以帮助:

 public class SpecialDataRow<T> : T where T : DataRow { public int SpecialFactor { get; set; } } 

这将使得从DataRow和任何派生的DataRows(如types的数据集生成的)

我没有看到任何其他方式如何编写这样一个类

这对此有什么用处?

请记住,尽pipe名称,generics从来没有打算支持generics编程。

为了支持这样的function,他们必须对CLR进行一些非常重大的改变。

你需要定义一个从编译时甚至不存在的类派生的类。

他们为什么要跳过这样的环节,从根本上妥协他们的types系统只是为了增加这个function? 这值得么?

如果你这么想,告诉他们为什么。 在connect.microsoft.com上写下反馈,告诉他们为什么这个function是如此重要,以至于它必须被添加。

C ++模板不能与C#generics进行比较。 C ++模板像macros一样被预处理,而.NET中的generics则由运行时处理。

但还有其他人对我的了解比我更多