重载运算符 c# Vector

overloading operator c# Vector

所以,我试图覆盖 c# 中的“-”运算符以便能够减去 2 个向量,但是我的 class 无法实现 Vector。

namespace Vectors
{
    class VectorUtilv
    {
        private Point _p;
        private Point _p2;
        private Vector _v;


         public Vector V
        {
            get { return _v; }
            set { _v = value; }
        }

        public Point AddVector(Vector v)
        {
            _p.X = (_p.X + v.X);
            _p2.Y = (_p.Y + v.Y);

            return _p2;
        }

        // This is where I am trying to override but I cant add the v.X or 
        // the v.Y because it is not a vector. If i cast it as a vector the 
        // override doesn't work.
        //////////////////////////////////////////////////////////////////
        public static VectorUtilv operator -(Vector a, Vector b)
        {
            Vector v = new Vector();
            v.X = a.X - b.X;
            v.Y = a.Y - b.Y;
            return v;
        }
    }    
}

知道如何解决这个问题吗?

您只能在运算符自身中覆盖运算符 class。

将所有代码移至 Vector class。

在您的矢量 class 中,覆盖其中的“-”运算符

public class Vector
{
    public int X { get; set; }
    public int Y { get; set; }

    public static Vector operator -(Vector a, Vector b)
    {
        Vector v = new Vector();
        v.X = a.X - b.X;
        v.Y = a.Y - b.Y;
        return v;
    }
}

那你就可以这么用了

Vector v1 = new Vector { X = 5, Y = 9};
Vector v2 = new Vector { X = 3, Y = 4 };
Vector vr = v1 - v2;
Console.WriteLine("Resultant Vector X: {0} & Y:{1}", vr.X, vr.Y);

希望对你有所帮助

因为您正在尝试为 Class 定义运算符。至少它的一个参数应该在类型为你的 Class 的运算符中使用。例如你不能有 class Car 并且定义 Operator 只得到 int.

您不能覆盖现有 classes.only 您自己的 classes 的运算符。

如果您不能修改 Vector Class,那么您应该声明自己的 class 命名 Vector。或使用您的 class 作为运算符的类型。

所以你可以

    class VectorUtilv
    {
        private Point _p;
        private Point _p2;
        private Vector _v;
        public static VectorUtilv operator -(VectorUtilv a, VectorUtilv b)
        {
            //...
        }
    }

    class Vecotr
    {
        private Point _p;
        private Point _p2;
        private Vector _v;
        public static Vecotr operator -(Vecotr a, Vecotr b)
        { 
            //...
        }
    }

但是如果你使用方案2,那么你在使用Vector的时候需要使用限定符。

System.Windows.Vector // is in Windows assembly
Vector // is your class

感谢您的精彩回复。我希望我能在弄清楚之前检查一下。会节省我很多时间。我最终完全按照你们所说的做了。这是我的。

public 静态 VectorUtil 运算符 -(VectorUtil aHeroPoint, VectorUtil bEnemyPoint) { VectorUtil v = new VectorUtil(); v.Vec = new Vector(( aHeroPoint._p.X - bEnemyPoint._p.X),( aHeroPoint._p.Y - bEnemyPoint._p.Y)); return v; }