2015-08-19 14 views
5

in F #:StructuralComparisons per gli array

[0] = [0] = true 

In C# .NET o BCL in generale:

StructuralComparisons.Equals(new int[] { 0 }, new int[] { 0 }) == false 

Perché?


Postscript:

La ragione per cui ho pensato che avevo il "diritto" Uguale era perché questo si è rivelato essere vero:

var a = new { X = 3, Y = new { Z = -1 } }; 
var b = new { X = 3, Y = new { Z = -1 } }; 

StructuralComparisons.Equals(a, b) == true; 
+1

'new int [] {0} .SequenceEqual (new int [] {0}) == true;' –

+0

Sì, ma voglio avere un'uguaglianza strutturale generale attraverso i grafici degli oggetti - ma solo gli array come mostrato qui. Il motivo per cui ho scelto gli array era perché non erano uguali. –

+0

Ecco il post sul blog di Don Syme su Equality and Comparison in F #: http://blogs.msdn.com/b/dsyme/archive/2009/11/08/equality-and-comparison-constraints-in-f-1 -9-7.aspx – Petr

risposta

8

Ecco perché si sta andando verso il basso per object.Equals(objA, objB) che non sarà in grado di gestire questo tipo di confronto.

Invece fare questo:

StructuralComparisons.StructuralEqualityComparer.Equals(..., ...) 
+0

Mi sento in imbarazzo! –

+2

Non essere. Il fatto di aver incorporato quei metodi di supporto nella base di 'object' ha causato molti bug in molti codici, sono disponibili attraverso l'intellisense ma a volte è difficile distinguerli da quelli che effettivamente si vogliono. –

+0

Inoltre, per il commento sul motivo per cui 0 == 0 in base all'oggetto. Equals, questo è spiegato nella [documentazione] (https://msdn.microsoft.com/en-us/library/bsc2ak47 (v = vs.110) .aspx) che dice che per i tipi di riferimento viene effettuato un confronto di riferimento, ma per i tipi di valore viene effettuato un confronto di valori. –

Problemi correlati