在F#中重载Vector2的等号运算符("=") - 不同的向量被报告为相等

3

使用数学运算符对XNA Vector2进行操作是可行的,这要归功于重载,例如:

new Vector2(1.0f, 2.0f) + new Vector2(2.0f, 3.0f) // {X:3 Y:5}

(非常方便)

但是看看这个:

// Okay, this works fine.
new Vector2(1.0f, 2.0f) = new Vector2(1.0f, 2.0f) // true
// Is it checking for type equality?
new Vector2(1.0f, 2.0f) = new Vector2(6.0f, 5.0f) // true

为什么它不调用Vector2的重载函数op_Equality(同样适用于op_Inequality)?如果直接调用,它们可以正常工作。
PS:如果有影响(我认为没有),我在Mono和Monogame下运行这个程序。
PPS:这主要只是让我无法使用=而已,但如果我真的需要,我可以使用Vector2.Equals。

2
你在代码中重新定义了 (=) 吗? - Daniel
不是,但我曾考虑过这样做来具有讽刺意味地解决这个问题。 - Jwosty
2个回答

3

看起来不同版本的MonoGame程序集之间必须有一些差异,因为当我在Windows上(使用WindowsGL版本)在F# Interactive中运行代码时,我得到了预期的结果:

> #r @"C:\Program Files (x86)\MonoGame\v3.0\Assemblies\WindowsGL\MonoGame.Framework.dll" 
  open Microsoft.Xna.Framework;;

> new Vector2(1.0f, 2.0f) = new Vector2(1.0f, 2.0f);;
val it : bool = true
> new Vector2(1.0f, 2.0f) = new Vector2(6.0f, 5.0f);;
val it : bool = false

我还尝试引用位于Linux目录中的程序集(虽然我是在Windows上这样做的),它也可以工作,所以有些奇怪。你使用的平台是什么?你能否尝试在F#交互中仅运行上述脚本以测试它是否在应用程序之外也能正常工作?


尝试过了(当然将路径适应为我的机器上的正确路径),并且两个比较都返回了true。我在Mac 10.8.2下运行Mono 2.10.9上的F# 3.0。 - Jwosty

1
F#的等号运算符无法被重写,但对于非F#类型,它应该等同于使用非静态的Equals方法(如规范中的伪代码所述)。也许在你的示例中还有其他情况?

嗯,不对...我在FSI中准确地测试了我的样本,结果是一样的... :/ - Jwosty
但是,是的,我认为它应该这样做。 - Jwosty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接