2013-02-14 43 views
3

使用數學運算符適用於XNA Vector2s,thanks to the overloads,例如:超載平等操作上Vector2( 「=」)在F# - 不同的載體報告等於

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 2013-02-14 23:13:47

+0

沒有,但我想這樣做來解決這個具有諷刺意味的問題 – Jwosty 2013-02-15 06:13:58

回答

1

F#等號運算符不能被覆蓋,但對於非F#類型,它應該等效於使用非靜態的Equals方法(如pseudocode in the spec所述)。你的例子中可能還有別的東西?

+0

嗯,不...我已經在FSI中完全測試了我的樣本,並且得出了相同的結果...:/ – Jwosty 2013-02-14 23:08:12

+0

但是,這就是我它應該這樣做。 – Jwosty 2013-02-14 23:08:30

3

看起來必須有不同版本的MonoGame組件之間存在一些差異,因爲當我在Windows上運行的代碼在F#互動(使用WindowsGL版),我得到預期的結果:

> #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#交互式上面的腳本來測試它是否在你的應用程序之外工作嗎?

+0

嘗試過(但當然適合我的機器上正確路徑的路徑),並且它在兩次比較中都返回true。我在Mac 10.8.2下的Mono 2.10.9上運行F#3.0 – Jwosty 2013-02-15 06:25:31