2010-12-04 24 views
3

J'ai donc une structure simple Point avec deux doubles X et Y. Je calcule un tableau d'environ trois cents d'entre eux et définir ce tableau comme ItemsSource pour un ListView dans WPF. Cet appel finit par lancer StackOverflowException.StackOverflow lors de la configuration de ListView.ItemsSource

De pauses débogueur au début de la méthode Equals dans mon struct, que je mis en œuvre comme tant (devrait-il important):

public override bool Equals(object obj) 
{ 
    if (obj is Point) 
    return Equals(obj); 

    return false; 
} 
public bool Equals(Point other) // Implement IEquatable<T> 
{ 
    return this.x == other.x && this.y == other.y; 
} 

Si je change que ceci:

public override bool Equals(object obj) 
{ 
    return false; 
} 

Rien ne se passe et les chiffres sont affichés. Je ne sais vraiment pas ce que j'ai fait de mal ici, donc je ne sais pas comment réparer ça. Des pointeurs?

Répondre

6

Le programme essaie d'appeler à nouveau Equals(object obj) parce que vous passez obj comme object même s'il s'agit d'un Point. Donc, essentiellement, cette surcharge s'appelle encore et encore.

Vous avez jeter obj-Point lorsque vous passez dans l'appel intérieur, donc il va appeler la méthode Equals(Point other) à la place:

public override bool Equals(object obj) 
{ 
    if (obj is Point) 
    return Equals((Point) obj); 

    return false; 
} 
+0

qui résolvent. d il! Je ne peux pas croire que j'ai fait une telle erreur stupide .. Merci de l'avoir signalé. –

+0

+1: pour en faire la preuve si tôt – TalentTuner

+0

@Saurabh: Merci, j'ai un peu d'affinité avec les surcharges de méthodes. – BoltClock

5

Juste un quickie - une autre façon d'écrire Egaux (objet) méthode est:

public override bool Equals(object obj) 
{ 
    return (obj is Point) && Equals((Point)obj); 
} 

(la première série de crochets est pas vraiment nécessaire, mais je pense que cela aide la lisibilité)

+0

+1 pour l'astuce de court-circuit :) – BoltClock

+0

Ça a l'air mieux, merci. –