.Net和In C#上的多态数字

真的很遗憾在.Net中没有数字的多态性,即没有统一不同类型的数字类型的数字接口,如bool,byte,uint,int等。在极端情况下,我们想要一个完整的抽象包代数类型。

Joe Duffy有一篇关于这个问题的文章:

http://www.bluebytesoftware.com/blog/CommentView,guid,14b37ade-3110-4596-9d6e-bacdcd75baa8.aspx

您如何在C#中表达这一点,以便在不影响.Net或C#的情况下对其进行改造?

我有一个想法,首先要定义一个或多个抽象类型(接口,如INumeric – 或者比它更抽象),然后定义实现这些的结构,并在提供返回新类型的操作时包装类型(如int)(例如Integer32: INumeric;其中添加将被定义为

public Integer32 Add(Integer32 other) { return Return(Value + other.Value); } 

我有点害怕这段代码的执行速度,但至少它是抽象的。

没有运营商超载的好处……

还有其他想法吗?

.Net看起来不像一个可行的长期平台,如果它不能拥有我认为的这种抽象 – 并且对它有效。

抽象是重用。

更新:

到目前为止,这是一个示例实现类型签名:

 public struct Integer32 : INumeric, IOrder 

补偿缺乏协变返回类型。

有人已经开始写一些可以解决你的问题的事情了。 它被称为通用运算符 ,可在杂项实用程序库中找到 。

csharp语言团队已经在研究这个问题。 如果你想在C#中开始读取类型类的未来视图

https://github.com/dotnet/csharplang/issues/164

在此处输入图像描述

它似乎得到了Mads Torgesson的支持,所以它不仅仅是一个流浪的Haskell粉丝的随机post。

在C#land中给出类型类或形状的例子是

 public shape SGroup { static T operator +(T t1, T t2); static T Zero { get; } } 

注意这不像是一个界面。 它声明属于SGroup的静态方法。 请继续阅读以了解更多详情和讨论 。

如果您打算使用C#4.0,那么您可以使用dynamic轻松模拟通用数学运算。 以下是一个简单添加function的示例(有关更多信息, 请参阅此博客 ):

 public static T Add(T a, T b) { dynamic ad = a; dynamic bd = b; return ad + bd; } 

我没有玩过这个,所以我不能多说性能。 使用动态肯定会有一些性能价格,但我认为如果您多次调用该函数,DLR应该能够进行非常有效的优化。 事实上,如果它具有与上面提到的通用运营商类似的性能特征,我不会感到惊讶。