gpt4 book ai didi

c# - 我可以为我不直接控制的两个类添加隐式转换吗?

转载 作者:可可西里 更新时间:2023-11-01 03:09:10 25 4
gpt4 key购买 nike

我希望能够在两个不兼容的类之间进行隐式转换。

其中一个类是 Microsoft.Xna.Framework.Vector3,另一个只是 F# 项目中使用的 Vector 类。我正在使用 XNA 在 C# 中编写一个 3d 游戏,并且——虽然它是在 3D 中绘制的,但游戏玩法仅在两个维度上发生(它是一个鸟瞰图)。 F# 类使用 2D 向量处理物理:

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(v.x, v.y, 0) 或其他内容即可。

虽然我不知道该怎么做。我不能在 F# 中添加隐式转换,因为类型系统(正确地)不允许这样做。我不能将它添加到 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# 中进行转换,但这对我来说似乎是错误的——物理库不应该知道或关心我正在使用什么框架编写游戏。

最佳答案

不,你不能。隐式运算符必须定义为其中一个类的成员。但是,您可以定义一个扩展方法(您的示例不起作用,因为扩展方法必须在 public static class 中)。

public static class ConverterExtensions
{
public static Vector ToVector (this Vector3 input)
{
//convert
}
}

关于c# - 我可以为我不直接控制的两个类添加隐式转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5526601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com