gpt4 book ai didi

c# - 在泛型中实现算术?

转载 作者:可可西里 更新时间:2023-11-01 08:24:05 25 4
gpt4 key购买 nike

是否可以在 C# 泛型中实现基本算术(至少是加法),就像您可以的那样 with C++ templates ?我已经尝试了一段时间让它们启动并工作,但 C# 不允许您多次声明相同的泛型类型,就像您可以使用模板一样。

广泛的谷歌搜索没有提供答案。

编辑:谢谢,但我正在寻找一种在编译时进行算术运算的方法,在泛型类型中嵌入诸如教堂数字之类的东西。这就是为什么我链接了我所做的文章。 泛型中的算术,而不是泛型实例上的算术。

最佳答案

不幸的是,您不能对泛型类型使用算术运算

T Add(T a, T b)
{
return a + b; // compiler error here
}

不能在 C# 中工作!

但是您可以创建自己的数字类型并重载运算符(算术运算符、相等运算符和隐式显式)。这使您可以以一种非常自然的方式与他们合作。但是,您不能使用泛型创建继承层次结构。您将不得不使用非通用基类或接口(interface)。

我只是用矢量类型做的。此处为缩短版:

public class Vector
{
private const double Eps = 1e-7;

public Vector(double x, double y)
{
_x = x;
_y = y;
}

private double _x;
public double X
{
get { return _x; }
}

private double _y;
public double Y
{
get { return _y; }
}

public static Vector operator +(Vector a, Vector b)
{
return new Vector(a._x + b._x, a._y + b._y);
}

public static Vector operator *(double d, Vector v)
{
return new Vector(d * v._x, d * v._y);
}

public static bool operator ==(Vector a, Vector b)
{
if (ReferenceEquals(a, null)) {
return ReferenceEquals(b, null);
}
if (ReferenceEquals(b, null)) {
return false;
}
return Math.Abs(a._x - b._x) < Eps && Math.Abs(a._y - b._y) < Eps;
}

public static bool operator !=(Vector a, Vector b)
{
return !(a == b);
}

public static implicit operator Vector(double[] point)
{
return new Vector(point[0], point[1]);
}

public static implicit operator Vector(PointF point)
{
return new Vector(point.X, point.Y);
}

public override int GetHashCode()
{
return _x.GetHashCode() ^ _y.GetHashCode();
}

public override bool Equals(object obj)
{
var other = obj as Vector;
return other != null && Math.Abs(other._x - _x) < Eps && Math.Abs(other._y - _y) < Eps;
}

public override string ToString()
{
return String.Format("Vector({0:0.0000}, {1:0.0000})", _x, _y);
}
}

关于c# - 在泛型中实现算术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10951392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com