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

op_Equalityでは、 Vector2のオーバーロードを呼び出さないのはなぜop_Inequalityですか? 直接呼び出された場合、期待どおりに機能します。

PS: それが重要な場合は、そうではないと思いますが、私はこれを Mono と Monogame で実行しています。

PPS: これは主に、 を使用できないことが面倒ですが=、本当に必要な場合は Vector2.Equals を使用できます。

4

2 に答える 2

3

WindowsGLF# Interactive のWindows で (バージョンを使用して) コードを実行すると、期待どおりの結果が得られるため、MonoGame アセンブリの異なるバージョン間には何らかの違いがあるはずです。

> #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 に答える