2008-09-21 9 views
2

J'ai une propriété publique mis sous ma forme de type ListE<T> où:Debugging traitement Designer VS 2008

public class ListE<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable 

Ouais, c'est une bouchée, mais c'est ce que le concepteur a besoin pour qu'il apparaisse comme modifiable collection dans la fenêtre Propriétés. Ce qu'il fait! Donc, je clique sur le petit bouton [..] pour éditer la collection, puis sur Ajouter pour ajouter un élément à la collection.

L'opération arithmétique a entraîné un débordement.

Maintenant, ceci est une liste très basique, un peu plus qu'un tableau en expansion. La seule partie qui se rapproche de l'arithmétique dans le tout est dans la fonction d'expansion, et même celle-ci utilise un décalage à gauche plutôt qu'une multiplication, de sorte que cela ne débordera pas. Tout cela me fait penser que cette exception est soulevée dans le concepteur, peut-être causée par une petite inattention à l'implémentation de ma part, mais je ne trouve pas de moyen de tester ou de déboguer ce scénario. Est-ce que quelqu'un a des idées intelligentes?

EDIT: Oui, je peux utiliser la propriété avec succès, même bien manuellement, à savoir. dans le gestionnaire OnLoad, et je suppose que c'est ce que je vais devoir faire si je ne peux pas obtenir ce travail, mais ce ne serait pas idéal. :(

+0

Il n'est pas lié à votre problème, mais sachez que vous pouvez uniquement spécifier que ListE implémente IList . –

+0

Je déteste vous le casser, mais la liste de la bibliothèque standard a exactement la même signature. Si vous allez tapez "Liste " et appuyez sur F12 dans VS, cela vous amènera à une définition reconstituée. –

+0

Enfait, IList implémente les autres interfaces génériques avec IEnumerable, donc je pourrais le réduire comme ListE : IList , IList, mais de cette façon est plus explicite. –

Répondre

3

Je ne peux pas comprendre ce qui vous motive à essayer de réinventer la liste <T> roue de cette façon, mais pour répondre à votre question: je voudrais ajouter une ligne "System.Diagnostics.Debugger.Break()" au constructeur de votre classe.

Ensuite, essayez de l'utiliser dans le concepteur, et vous obtiendrez une fenêtre vous demandant si vous souhaitez attacher un débogueur. Associez une seconde instance de Visual Studio en tant que débogueur et vous pourrez définir des points d'arrêt dans votre code et débuter le débogage.

+0

Reimplementing roues peut être amusant. Il n'existe pas non plus de méthode polymorphe pour étendre les collections de base afin d'inclure des événements, car aucune des fonctions définies ne peut être surchargée. Par conséquent, si je la renvoie à la classe d'origine, je n'ai plus aucun événement. –

+0

Et pour l'enregistrement, entre autres choses, il essayait d'utiliser CopyTo() pour une raison quelconque, et je ne l'avais pas implémenté. Fixez cela d'abord, puis voyez où nous allons à partir de là ... –

0

Un point de départ serait de faire des maths avec votre propriété ListE`1 :: Count Si cela a un défaut subtil (ie c'est plus compliqué que de retourner this.innerList.Count) être à l'origine du concepteur de dépassement arithmétique sur une opération. Normalement, les débordements arithmétiques ne se produisent pas à moins que spécifiquement demandé en utilisant la syntaxe

checked 
{ 
    // ... 
} 

.

+0

La propriété My Count est simple: public int Count {get {return _maxIndex + 1; }} où _maxIndex est le dernier élément du tableau. –

+0

Je n'ai pas non plus de code {} vérifié, ce qui prouve seulement qu'il se passe quelque part dans le Designer, n'est-ce pas? –

+0

@monoxide: il pourrait s'agir de votre _maxIndex + 1 déborde, ou la façon dont ils utilisent votre _maxIndex + 1 (disons que c'est Int32.MaxValue) déborde. Plus important encore, je ne suis pas entièrement sûr de la façon dont vous allez déboguer cela. – user7116

0

Vous n'avez pas besoin d'ajouter le débogueur.Break(); appelez votre code pour le déboguer. Vous pouvez simplement ouvrir une instance différente de VS et la joindre à celle dans laquelle vous l'utilisez et vous devriez être capable de le déboguer sans problème (assurez-vous simplement que les symboles sont chargés).

Questions connexes