3

.Net 中没有数字的多态性,即没有统一不同类型的数字类型(如 bool、byte、uint、int 等)的 INumeric 接口,这真是太可惜了。极端的人想要一个完整的抽象包代数类型。

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<Integer32, Int32>, IOrder<Integer32, Int32>

补偿协变返回类型的缺乏。

4

3 回答 3

5

有人已经努力写一些可以解决你困境的东西。它称为Generic Operators,可在Miscellaneous Utility Library中找到。

于 2010-03-08T21:21:01.880 回答
1

csharp 语言团队已经在研究这个问题。如果您想了解 C# 中类型类的未来,请开始阅读

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

在此处输入图像描述

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

在 C#领域中给出的类型类或形状的示例是

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

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

于 2017-07-17T12:06:47.893 回答
0

如果您打算使用 C# 4.0,那么您可以使用dynamic. 下面是一个简单的加法函数的例子(更多信息参见这篇博客):

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

我没有玩过这个,所以我不能对性能说太多。使用动态肯定会有一些性能代价,但我认为如果您多次调用该函数,DLR 应该能够进行非常有效的优化。事实上,如果它具有与上面提到的通用运算符相似的性能配置文件,我不会感到惊讶。

于 2010-03-09T02:47:49.597 回答