作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
是否可以在 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/
我是一名优秀的程序员,十分优秀!