发现System.Drawing.PointF
似乎有运算符减去尺寸而不是其他PointF,感到有点震惊。所以我正在尝试编写自己的PointF类,但它需要能够将System.Drawing.Points自动转换为它,否则它实际上不会增加任何便利性。所以我写了这些构造函数:
public PointF(float x = 0, float y = 0)
{
this.x = x;
this.y = y;
}
public PointF(System.Drawing.PointF p) : this(p.X, p.Y) { }
public PointF(System.Drawing.Point p) : this(p.X, p.Y) { }
但我仍然收到这个错误:
无法从'System.Drawing.Point'转换为'my_namespace.PointF'
(我有一个接受my_namespace.PointF
但我正在传递System.Drawing.Point
)的函数。
第三个构造函数不应该启动并自动转换它吗?
答案 0 :(得分:3)
您的my_namespace.PointF
课程中是否定义了隐式转化?它不会自动转换。
public PointF(float x = 0, float y = 0)
{
this.x = x;
this.y = y;
}
public PointF(System.Drawing.PointF p) : this(p.X, p.Y) { }
public PointF(System.Drawing.Point p) : this(p.X, p.Y) { }
//add this:
public static implicit operator PointF(System.Drawing.Point pt)
{ return new PointF(pt); }
答案 1 :(得分:1)
您是否考虑过选择编写“扩展方法”而不是推出自己的类?
您不能通过extn进行操作符重载。方法(在框架的下一版本中提出)..但你应该能够使用名为Add()的同义方法来实现+和get by。
答案 2 :(得分:1)
这为我编译:
class PointF {
float x; float y;
public PointF(float x, float y)
{
this.x = x;
this.y = y;
}
public PointF(System.Drawing.PointF p) : this(p.X, p.Y) { }
public PointF(System.Drawing.Point p) : this(p.X, p.Y) { }
public static implicit operator PointF(System.Drawing.Point pt) { return new PointF(pt); }
public static implicit operator PointF(System.Drawing.PointF pt) { return new PointF(pt); }
}
//....
static void test(pointf.PointF p) {
}
//....
test(new System.Drawing.PointF(1, 1));