我一直在寻找我的问题解决方案好几个小时没有明确的答案,所以我不得不问这里。 这是我的示例代码:
class Geometry
{
public static Vector2 quadraticCurvePoint(Vector2 _p1, Vector2 _p2, Vector2 _p3, float _t)
{
return (1 - _t) * (1 - _t) * _p1 + 2 * (1 - _t) * _t * _p2 + _t * _t * _p3;
}
public static Vector3 quadraticCurvePoint(Vector3 _p1, Vector3 _p2, Vector3 _p3, float _t)
{
return (1 - _t) * (1 - _t) * _p1 + 2 * (1 - _t) * _t * _p2 + _t * _t * _p3;
}
public static T[] quadraticCurve<T>(T _p1, T _p2, T _p3, uint _q)
{
int points_count = (int)_q + 2;
T[] points = new T[points_count];
points[0] = _p1;
points[points_count - 1] = _p3;
float ti = 1 / points_count;
float t;
for (int i = 1; i <= _q; i++)
{
t = ti * i;
points[i] = quadraticCurvePoint(_p1, _p2, _p3, t);
}
return points;
}
}
我想只传递类型Vector2和Vector3,但我不知道如何使这个调用points[i] = quadraticCurvePoint(_p1, _p2, _p3, t);
工作因为程序不知道什么类型是_p1 _p2 _p3。
Vector2和Vector3是OpenTK项目的一部分。它们被声明为public struct Vector2 : IEquatable<Vector2>
并具有运算符实现。
当然我可以简单地为Vector2和Vector3编写这个方法的重载版本(重复代码),但我不是BADASS程序员风格。
我知道我已经重载了quadraticCurvePoint方法但是它会以与quadraticCurve方法相同的方式进行改进 - 如果可能的话......
答案 0 :(得分:0)
在C#中使用泛型与在C ++中完全不同,编译器不会试图“猜测”你的意思,你需要明确地告诉它。这是因为在C#中,generics不仅仅是类的模板,而是在编译时指定的。它们是真实的类型。
最好的方法是使用通用参数约束:https://msdn.microsoft.com/library/d5x73970.aspx