使用泛型类型的任何优雅方式?

InB*_*een 10 c# generics operators

我正在一个小型教育项目中工作,我们必须实现一个n维矩阵.根据上下文,此矩阵可以使用我们自己的内置ComplexNumber结构,System.Double也可以使用非常简单的示例,使用整数类型(主要是System.Int32).

由于应用程序的性质,我们不需要实现闪电般快速的性能.

因此,我的第一个想法是实行Matrix<T>地方T会以某种方式需要被限制在"数字".

这样做的一个明显问题是,语言中没有办法T用定义的运算符约束泛型类型.此外,我没有看到一种简单的方法来重新T合理到合理的类型.

我的问题是:

  1. 有人可以指出我的优雅方式,使用通用类型进行数学运算,不会过多地影响性能,并以某种方式使内置类型工作(如果可能).

  2. 如果Eric读过这篇文章,那么这个功能(通过定义的运算符约束泛型类型)是否会出现在C#设计会议的假设未来版本中,并且它是否已经接近将其纳入语言?

我知道实现一个ComplexMatrix类型并为每个矩阵"子类型"(双重,整数等)创建包装器更容易,更好,并支付我们的复杂类型和矩阵元素发生的任何类型之间的转换的性能成本成为.这个问题更多的是出于对某人如何实施类似场景的好奇心.

Eri*_*ert 18

如果埃里克读过这个,

如果您想要引起我注意的事情,请尝试我博客上的联系链接.或者将我的全名写在问题的文本中,以便我搜索自己会找到我.

这个功能(通过定义的运算符约束泛型类型)是否会出现在C#设计会议的假设未来版本中,并且它是否已经接近使用它成为语言?

实际上,这是一个经常被要求的功能.自从C#1.0以来,我们一直在收到这类事情的请求.

该功能需要CLR团队的支持,而不仅仅是语言 - 这是我们希望集成到所有语言中的一种功能,这会增加成本.

CLR团队已经对这样的功能表示了兴趣,但他们也有许多竞争功能,他们可以做,以及实现这些功能的时间和精力有限.

有许多方法可以实现这样的功能.例如,我们可以添加在接口中指定静态方法的功能:

interface IAddable<T>
{
    static T operator+(T x, T y);
}
Run Code Online (Sandbox Code Playgroud)

然后

static T Sum<T>(IEnumerable<T> seq) where T : IAddable<T>
{
    T sum = default(T);
    foreach(T item in seq) sum = sum + item;
    return sum;
}    
Run Code Online (Sandbox Code Playgroud)

我们的想法是接口意味着"实现此接口的类型必须具有给定的静态方法".然后我们让int自动实现IAddable<int>,依此类推.

在运行时生成的通用代码的世界中如何有效地这样做是一个悬而未决的问题.

我赶紧补充一点,这只是一个想法的草图.有很多方法可以实现这种功能."界面中的静力学"理念是一种比数学更广泛使用的理念,这对我们很有吸引力.如果我们要付出这种功能的巨大代价,那么拥有一个非常普遍,强大的功能而不是一个专注于数学的功能将会很不错.

另一方面,完美是善的敌人; 最好只关注数学问题而不是寻求更昂贵的通用解决方案.

这是一场持续的辩论.它肯定在每个人的雷达屏幕上,但我不希望它很快.语言设计人员都在努力完成异步CTP的反馈.

与往常一样,埃里克关于假设未经宣布的未来产品的假设未来语言特征的思考仅用于娱乐目的.


归档时间:

查看次数:

895 次

最近记录:

14 年,6 月 前