5 votes

Le point d'arrêt conditionnel ne fonctionne pas dans Visual Studio 2015

J'ai un problème pour déboguer mon code C# dans Visual Studio 2015.

Je souhaite ajouter une simple expression à un point d'arrêt,

J'ai donc ajouté hierarchyRelation != null en l'état. Il s'agit d'une variable locale de la méthode que je débogue, et elle existe.

Cependant, lors de l'exécution, j'obtiens l'erreur suivante

"La condition d'un point d'arrêt n'a pas été exécutée. La condition était "hierarchyRelation != null". L'erreur renvoyée était "Le point d'arrêt doit évaluer une opération booléenne". Cliquez sur OK pour vous arrêter à ce point d'arrêt. ce point d'arrêt.

En fait, la condition était plus complexe, mais c'est le cas le plus simple qui reproduit le problème. J'ai essayé des variantes, et même de comparer les propriétés de cette variable, et le résultat est toujours le même.

Si j'essaie une condition constante, comme 1 != 2 o 1 = 1 cela fonctionne bien. Y a-t-il un problème ? La question la plus proche que j'ai trouvée est la suivante cette mais c'était en vb code . Sa solution a été d'ajouter une méthode de débogage directement dans le code. Bien que je puisse le faire, je voudrais savoir pourquoi cela ne fonctionne pas.

Le code de la méthode

private HierarchyNodeDto GetNodeTreeThatContainsText<TRollup, TLeaf, THierarchyRelation>(HierarchyNodeDto root, string text, PreFilter preFilter, Func<TLeaf, bool> leafContainsTextFunc, bool parentContainsText) where TRollup: HierarchyNodeDto where TLeaf: HierarchyNodeDto {
            dynamic rootNode = root as TRollup;
            if (rootNode != null) {
                if (rootNode.Nodes == null) {
                    return null;
                }
                var childNodesWithText = new List<THierarchyRelation>();
                foreach (var hierarchyRelation in rootNode.Nodes) {
                    var isLeaf = hierarchyRelation.Node.GetType() == typeof(TransactionTypeHierarchyLeafDto) || hierarchyRelation.Node.GetType() == typeof(AccountHierarchyLeafDto);
                    if (!isLeaf && hierarchyRelation.Node.Name != null && hierarchyRelation.Node.Name.ToLower().Contains(text) && preFilter != PreFilter.Leafs) {
                        childNodesWithText.Add(hierarchyRelation);
                        continue;
                    }
                    var subtreeThatContainsText = this.GetNodeTreeThatContainsText<TRollup, TLeaf, THierarchyRelation>(hierarchyRelation.Node, text, preFilter, leafContainsTextFunc, rootNode.Name.ToLower().Contains(text));
                    if (subtreeThatContainsText == null) {
                        continue;
                    }
                    hierarchyRelation.Node = subtreeThatContainsText;
                    childNodesWithText.Add(hierarchyRelation);
                }
                rootNode.Nodes = childNodesWithText;
                if (rootNode.Nodes.Count > 0 || (rootNode.Name.ToLower().Contains(text) && preFilter != PreFilter.Leafs)) {
                    return rootNode;
                }
                return null;
            }
            var rootLeaf = root as TLeaf;

            return rootLeaf != null && ((leafContainsTextFunc.Invoke(rootLeaf) && preFilter != PreFilter.Nodes) || (parentContainsText && preFilter != PreFilter.Leafs)) ? rootLeaf : null;
        }

J'ajoute le point d'arrêt dans la première ligne à l'intérieur de la section foreach

enter image description here

4voto

Jevgeni Geurtsen Points 2611

Le problème est que la hierarchyRelation est une variable dynamique, mais je ne sais pas exactement pourquoi. D'après Expressions dans le débogueur cela devrait fonctionner (je n'ai pas trouvé de raison pour que cela ne fonctionne pas).

    static void Main(string[] args)
    {
        dynamic foo = new Foo();

        // conditional breakpoint 'foo.Nodes == null' here
    }

    internal class Foo
    {
        public IEnumerable<Foo> Nodes = null;
    }

Ce code déclenche la même exception chaque fois que le débogueur passe et évalue le point d'arrêt conditionnel. En tapant statiquement le code foo permettra au débogueur d'évaluer l'expression et de l'interrompre si nécessaire.

2voto

kileak Points 21

Je suis un peu en retard, mais j'ai rencontré le même problème, avec un objet dynamique.

Pour résoudre ce problème, je l'ai transformé en objet dans l'expression conditionnelle du point d'arrêt ; ainsi, dans votre cas, la procédure suivante fonctionnerait :

(object)hierarchyRelation!=null

Essayez et voyez si cela vous convient.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X