Могу ли я добавить неявное преобразование для двух классов, которые я не контролирую напрямую?

Я хотел бы иметь возможность неявно преобразовывать между двумя классами, которые в противном случае несовместимы.

Один из классов - это Microsoft.Xna.Framework.Vector3 , а другой - просто класс Vector , используемый в проекте F #. Я пишу 3D-игру на C # с XNA, и, хотя она нарисована в 3D, игровой процесс происходит только в двух измерениях (это вид с высоты птичьего полета). Класс F # заботится о физике, используя двумерный вектор:

type Vector<'t when 't :> SuperUnit<'t>> =
    | Cartesian of 't * 't
    | Polar of 't * float
    member this.magnitude =
        match this with
        | Cartesian(x, y) -> x.newValue(sqrt (x.units ** 2.0 + y.units ** 2.0))
        | Polar(m, _) -> m.newValue(m.units)
    member this.direction =
        match this with
        | Cartesian(x, y) -> tan(y.units / x.units)
        | Polar(_, d) -> d
    member this.x =
        match this with
        | Cartesian(x, _) -> x
        | Polar(m, d) -> m.newValue(m.units * cos(d))
    member this.y =
        match this with
        | Cartesian(_, y) -> y
        | Polar(m, d) -> m.newValue(m.units * sin(d))

Этот векторный класс использует систему единиц, используемую в физическом проекте, которая принимает собственные единицы измерения F # и группирует их вместе (единицы расстояния, времени, Масса и т. Д.)

Но XNA использует свой собственный класс Vector3 . Я хочу добавить неявное преобразование из F # Vector в XNA Vector3 , которое заботится о , двух измерениях, в которых происходит игровой процесс, осью которой является " вверх "и т. д. Это было бы просто, просто Vector v -> new Vector3 (vx, vy, 0) или что-то в этом роде.

Я не могу понять, как это сделать. Я не могу добавить неявное преобразование в F #, потому что система типов (справедливо) не позволяет этого. Я могу' t добавить его в класс Vector3, потому что он является частью библиотеки XNA. Насколько я могу судить, я не могу использовать метод расширения:

class CsToFs
{
    public static implicit operator Vector3(this Vector<Distance> v)
    {
        //...
    }
}

Это ошибка в ключевом слове this , а

class CsToFs
{
    public static implicit operator Vector3(Vector<Distance> v)
    {
        return new Vector3((float)v.x.units, (float)v.y.units, 0);
    }

    public static void test()
    {
        var v = Vector<Distance>.NewCartesian(Distance.Meters(0), Distance.Meters(0));
        Vector3 a;
        a = v;
    }
}

- ошибка в a = v; (не может неявно преобразовать ...)

Есть ли способ сделать это, не имея возможности поместить приведение в какой-либо из классов? В крайнем случае я мог открыть Microsoft.Xna.Framework и выполнить преобразование на F #, но мне это кажется неправильным - физическая библиотека не должна знать или заботиться о том, какой фреймворк я использую для написания. игра.

16
задан Carson Myers 2 April 2011 в 23:35
поделиться