3

由于重载,使用数学运算符适用于 XNA Vector2s,例如:

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。

4

2 回答 2

3

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

> #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# 交互中运行上述脚本来测试它是否在您的应用程序之外工作?

于 2013-02-14T23:13:55.887 回答
1

F# 相等运算符不能被覆盖,但对于非 F# 类型,它应该等效于使用非静态Equals方法(如规范中的伪代码所述)。也许你的例子中还有其他事情发生?

于 2013-02-14T23:05:18.350 回答