不太通用的generics? C#generics算术的一种可能解决方案

目前,C#中的generics不允许任何理智的方式来执行算术。 有一些尴尬的解决方法,但它们都不是很整洁,所有这些都会降低性能。 根据这次访谈 ,不可能实现具有算术类型的接口,因此建议使用这样的解决方法。

但你可以做的是让你的矩阵作为计算器的参数,并在计算器中,有一个名为multiply的方法。 你去实现它,然后将它传递给Matrix。

为什么我必须告诉高级编程语言如何添加和增加数字? [由于受欢迎的需求而编辑]

为什么不简单地允许将Generic限制为类型列表?

例如。

class Matrix where T : int,long,float,double 

语法当然可以是不同的。 但是编译器只需要检查类型是否在列表中,并且所使用的运算符适用于所有类型,这应该比显然太难的接口建议简单得多。

是否有任何明显的原因导致无法实施?

我认为您正在寻找OOP中函数式编程语言的function。 如果是这种情况,那么使用FP。

例如,在Scala中,您可以替换运算符,因此现在可以添加或乘以矩阵。

这是各种语言的情况,但不是所有OOP语言。

当不明显如何添加或增加generics时,为什么generics能够进行添加? 例如,如果我有一个对数类,那么乘法只是添加数字,但是,编译器怎么知道呢?

在C#中你可以做运算符重载,这可以解决你抱怨的问题: http : //msdn.microsoft.com/en-us/library/aa288467%28VS.71%29.aspx

C#团队决定如何进行generics,它不应该像上面的例子那样处理数学,但它们确实允许你帮助编译器知道如何进行数学运算,因此责怪他们不要问他们的意见首先是非常危险的,因为做出了决定,仿制药就像它们一样。 我相信它现在不会改变。

为什么不简单地允许将Generic限制为类型列表?

因为那时它不是通用的 。 generics扩展了整​​个类型系统的表现力; 它们不是一个廉价的搜索和替换机制,而是C ++模板。

是否有任何明显的原因导致无法实施?

我否认这个问题的前提。 如果我们想要违背generics的基本设计原则,它就可以实现。 哎呀,我可以在不到一个月的时间内实现它,我很确定,考虑到时间和预算。 但是,我有其他优先事项。

这是非常愚蠢的。

好吧,当我在星期一看到安德斯时,我一定会告诉他,来自互联网的Mike K认为他的想法是愚蠢的。

他甚至暗示这一事实表明C#开发人员的数量有限。

的确,我很清楚自己的个人局限。 我还有很多关于编程语言设计和实现的知识。

我还注意到,我们的预算以及我们无法控制的市场力量以及许多其他因素也受到限制。

最后,让我借此机会指出, 对可以回答您问题的人施加个人侮辱是违背您回答问题的目标。 如果您对这个主题感兴趣,可以考虑阅读我关于这个主题的短文:

http://blogs.msdn.com/ericlippert/archive/2008/02/20/how-to-not-get-a-question-answered.aspx

generics不是C ++模板。 编译器将仅允许对可validation的generics类型参数的操作对这些参数有效,因为在JIT编译之前不会插入要使用的确切类型。 C ++在编译时进行插入,并不关心操作是否可以显示对T的每个可能值都有效,只要它对您实际使用的T的特定值有效。

此外,像T:int这样的约束没有意义,因为不能有任何从int派生的类型,因为int是一个结构。 遵守这种约束的唯一类型是int本身。 如果你知道你的类型总是int,那么generics就变得毫无意义了。

我建议(并且借口我的有限知识,如果这听起来对任何人来说都是迟钝的话)用它们各自的关键词来实现模板和通用function。 在阅读完所有post(是的所有post)后,我不得不说我同意这两种观点:generics绝不应该是’成为一种廉价的搜索和替换机制,而是C ++模板’,但是当你必须实现它时2种类型的function变得令人讨厌:P

也许一个说明需要实现的运算符的IArithmetic接口可以用来使约束更紧凑?

由于在访谈中明确指出的原因,增加这种支持会增加额外的复杂性,以获得非常小的额外收益。 如果您知道如何设计和编写编译器,您可以(在其他一些论坛中)讨论什么程度的真或假,而不是它是“愚蠢”还是“有限”使用该语言的开发人员可能是…… 。