PointF的重载+运算符

时间:2015-08-23 00:12:20

标签: c# .net winforms operator-overloading

我是c#和Windows编程的新手。我知道在c#中,有一个叫做运算符重载的很棒的功能。我想在我的代码中应用这种技术。在下面的代码中,我想定义二进制+运算符,以便我可以连接两个PointF对象。

pointList.Add(point + center)行中,我收到了错误消息:

  

错误1运营商' +'不能应用于类型的操作数   ' System.Drawing.PointF'和   ' System.Drawing.PointF'

我不确定为什么会出现此错误,因为我已经为PointF重载了operator +。

 private static PointF operator+ (PointF point_left, PointF point_right) {
            return new PointF(point_left.X + point_right.X, point_left.Y + point_right.Y);
        }

        private void Form1_Paint(object sender, PaintEventArgs e) {
            List<PointF> pointList = new List<PointF>();
            PointF center = new PointF(50, 50);
            int radius = 50;
            for (int i = 0; i < 5; ++i) {
                double degree = (2.0 * Math.PI * i) / 5.0;
                PointF point = new PointF((float)(radius * Math.Cos(degree)), (float)(radius * Math.Sin(degree)));
                pointList.Add(point + center);
            }
            Brush brush = new LinearGradientBrush(new Point(20, 20), new Point(50, 50), 
                Color.Red, Color.Blue);
            e.Graphics.FillPolygon(brush, pointList.ToArray());
        }

编辑:在我重新编译代码后,我得到了一个不同的错误:

  

二元运算符的一个参数必须是包含类型

我真的想要为+重载PointF运算符。有什么工作吗?在c ++中,可以通过使用全局函数为不同的类重载运算符。如何实现c#?

2 个答案:

答案 0 :(得分:1)

您无法扩展内置结构和类来添加运算符。

或者,您可以创建一个扩展方法来完成工作:

public static class ExtensionMethods
{
    public static PointF Add(this PointF operand1, PointF operand2)
    {
        return new PointF(operand1.X + operand2.X, operand1.Y + operand2.Y);
    }
}

用法是:

 var p1 = new PointF(1, 1);
 var p2 = new PointF(2, 2);
 reult =p1.Add(p2);

答案 1 :(得分:0)

根据C#net/context,您必须将运算符重载声明为public static。这可能是你在这里问题的原因,虽然如果没有错误我也会感到惊讶。