C# 扩展类以使其可浇铸

C# 扩展类以使其可浇铸,c#,xna,C#,Xna,我想扩展一个类(Vector2),使其在某个点上可浇铸。 我该怎么做 部分问题: 扩展类 使一个班级可以被另一个班级铸造 最后,我希望能够做到这一点: Vector2 foo = new Vector2(5.2f); // X = 5.2f Y = 5.2F Point red = new Point(2,2); // X = 2 Y = 2 red = foo; // I know that you can make classes convert themselves automati

我想扩展一个类(Vector2),使其在某个点上可浇铸。 我该怎么做

部分问题:

  • 扩展类
  • 使一个班级可以被另一个班级铸造
  • 最后,我希望能够做到这一点:

    Vector2 foo = new Vector2(5.2f);  // X = 5.2f Y = 5.2F
    Point red = new Point(2,2);  // X = 2 Y = 2
    red = foo;  // I know that you can make classes convert themselves automatically... somehow?
    // Now red.X = 5 red.Y = 5
    
    你不能那样做

    是一个,不是一个。正如您所知,它不可能从中派生,因为结构在堆栈上分配固定的大小。所以多态性是不可能的,因为派生的将有不同的大小

    作为一种解决方法,您可以创建将返回struct实例的
    ToPoint

    注意:这种方法比隐式地将向量转换为点更直观,因为向量不是点。隐式强制转换在这些类型之间没有任何意义。实际上,隐式转换非常有用的情况很少。

    你不能这样做

    是一个,不是一个。正如您所知,它不可能从中派生,因为结构在堆栈上分配固定的大小。所以多态性是不可能的,因为派生的将有不同的大小

    作为一种解决方法,您可以创建将返回struct实例的
    ToPoint


    注意:这种方法比隐式地将向量转换为点更直观,因为向量不是点。隐式强制转换在这些类型之间没有任何意义。实际上,隐式转换非常有用的情况很少。

    这正是我在XNA项目中使用的方法。@user1306322是的,这样更好。如果将来
    Point
    将更改为另一个结构,则无需修改整个项目并重构所有
    新点(…)
    实例。我还发现这更具可读性。这正是我在XNA项目中使用的。@user1306322是的,这样更好。如果将来
    Point
    将更改为另一个结构,则无需修改整个项目并重构所有
    新点(…)
    实例。我也觉得这更具可读性。
    public static class Extensions {
        public static void ToPoint(this Vector2 vector) {
            return new Point((int)vector.X, (int)vector.Y);
        }
    }
    
    //Usage:
    Vector2 foo = new Vector2(5.2f);//X = 5.2f Y = 5.2F
    Point red = foo.ToPoint();