不太通用的泛型?C#泛型中算术的可能解决方案

Mar*_*k K -2 c# generics math types

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

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

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

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

例如.

class Matrix<T> where T : int,long,float,double
Run Code Online (Sandbox Code Playgroud)

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

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

Eri*_*ert 20

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

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

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

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

这是非常愚蠢的.

好吧,当我周一看到安德斯时,我一定会告诉他,来自互联网的迈克K认为他的想法是愚蠢的.

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

实际上,我很清楚我的个人局限.我还有很多关于编程语言设计和实现的知识.

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

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

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

  • 本机值类型*是.NET类型系统的第一类成员.它们继承自System.ValueType,后者继承自System.Object.现在,也许继承层次结构不能按照您希望的方式成功建模数字*.不幸的是,现在我无能为力.但幸运的是:微软在理解科学和金融计算社区的需求方面投入越来越多.希望在未来我们将有更多的工具可用于服务这个细分市场. (4认同)
  • @RBarryYoung如果你写下像T One(U a,V b){return a + b; 但是*手动*为T,U和V插入int,double,byte,long,ulong等(在某些情况下使用相同的一个).一旦处理编译器错误和警告,请查看反射器中的反编译代码.注意没有函数调用(大多数通用相关行为的当前"构建块").事实上,实际上注意到IL产生的几乎没有共性.就像我喜欢通用算术一样,我接受生成一个通用机制是*hard*. (2认同)
  • 然而,从1964年开始,每个BASIC编译器都能够正确地将多态算术运算符编译为机器指令,而不必依赖于生成函数调用.我想今天的编译器技术不像1964年那样先进?或许你的描述是红鲱鱼? (2认同)