为什么我不能将*运算符重载为使用2D向量乘以矩形?

时间:2011-06-29 17:41:28

标签: c# xna

我试图重载乘法运算符以方便缩放2D精灵,但似乎其中一个操作数必须是包含类型。这是一个遗憾,因为我发现我的解决方案不合逻辑。另外,我发现应该在其中一个操作数的类声明中声明这样的运算符重载。那么,我是否必须创建自己的自定义SuperRectangle类或者有一些解决方法?

public static Rectangle operator * (Rectangle rect, Vector2 scale)
{
    return new Rectangle(rect.X, rect.Y, (int)(rect.Width * scale.X), (int)(rect.Height * scale.Y));
}

1 个答案:

答案 0 :(得分:5)

如果一个或多个类型是用户定义的,并且重载定义包含在其中一个类型中,则可以重载*。如果涉及的类型是内置的和/或您不控制源代码,您将无法定义自己的重载。 (参见:C# Language Specification的第7.3和7.3.2节)

一般来说,您可以将您的逻辑转换为Rectangle和/或Vector2上的扩展方法,并仍然可以实现您的总体目标。

public static class RectangleExtensions 
{
    public static Rectangle MultiplyBy(this Rectangle rect, Vector2 scale)
    {
        return new Rectangle(//...
    }

    public static Rectangle MultiplyBy(this Vector2 scale, Rectangle rect) 
    {
        return new Rectangle(//...
    }
}

// using it
Rectangle output = yourRect.MultiplyBy(yourVector);