2015-08-19 22 views
5

In F #:StructuralComparisons für Arrays

[0] = [0] = true 

in C# oder .NET BCL im Allgemeinen:

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

Warum?


Nachsatz:

Der Grund, warum ich dachte, dass ich die „richtigen“ hatte Equals war, weil das wahr entpuppte:

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

Ja, aber ich eine allgemeine Strukturgleichheit haben will über Objektgraphen - aber nur Arrays wie hier gezeigt. Der Grund, warum ich Arrays auswählte, war, dass sie nicht gleich waren. –

+0

Hier ist Blog Post von Don Syme über Gleichheit und Vergleich in F #: http://blogs.msdn.com/b/dsyme/archive/2009/11/08/equality-and-comparison-constraints-in-f-1 -9-7.aspx – Petr

Antwort

8

Das ist, weil Sie nach unten zu object.Equals(objA, objB) gehen die kann diese Art von Vergleich nicht bewältigen.

Statt dies tun:

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

Ich fühle mich peinlich! –

+2

Sei nicht. Die Tatsache, dass sie diese Hilfsmethoden in die Basis von "Objekt" eingebettet haben, hat viele Bugs in viel Code verursacht, die durch Intellisense verfügbar sind, aber manchmal schwierig von denen zu unterscheiden, die Sie eigentlich wollen. –

+0

Auch für den Kommentar, warum 0 == 0 laut object.Equals, wird dies in der [Dokumentation] (https://msdn.microsoft.com/en-us/library/bsc2ak47 (v = vs.110) .aspx), die besagt, dass für Referenztypen ein Referenzvergleich durchgeführt wird, für Werttypen jedoch ein Wertevergleich. –