2

J'ai un problème de débogage mon code C# dans Visual Studio 2015.point d'arrêt conditionnel ne fonctionne pas dans Visual Studio 2015

Je veux ajouter une expression simple en un point d'arrêt,

J'ajouté hierarchyRelation != null comme condition. C'est une variable locale de la méthode que je débogue, et elle existe.

Cependant, dans l'exécution, je reçois l'erreur suivante

« La condition pour un point d'arrêt n'a pas exécuté. La condition était « hierarchyRelation! = Null ». L'erreur renvoyée est » Le must point d'arrêt condition évaluer une opération booléenne ». Cliquez sur OK pour arrêter à 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é les variantes et les propriétés même comparaison de cette variable et elle échoue toujours la même chose.

Si j'essaie une condition constante, comme 1 != 2 ou 1 = 1 cela fonctionne très bien. Y a-t-il un problème? La question connexe la plus proche que j'ai trouvée était this, mais c'était dans vb code. Sa solution consistait à ajouter une méthode de débogage directement dans le code. Bien que je puisse le faire, je veux 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 dans la foreach

enter image description here

+2

Le débogueur VS2015 a plutôt beaucoup de bugs, mais cela n'a pas l'air cassé quand je l'essaie. Veillez à installer les mises à jour, au moins jusqu'à la mise à jour 2. Les solutions possibles sont d'éviter les bogues avec Outils> Options> Débogage> Général, "Utiliser le mode de compatibilité gérée" et "Utiliser les évaluateurs d'expressions C# et VB.NET". –

+0

J'ai installé la version 14.0.25431.01 Update 3. Je vais essayer de vérifier ce mode de compatibilité –

Répondre

1

Le problème est que la hierarchyRelation est une variable dynamique bien que je ne suis pas totalement sûr pourquoi. Selon Expressions in the Debugger il devrait fonctionner (je ne pouvais pas trouver une raison pour laquelle il ne devrait 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 réussit et évalue le point d'arrêt conditionnel. En tapant de manière statique la variable foo, le débogueur est en mesure d'évaluer l'expression et de la casse en cas de besoin.

+0

ok donc il semble que ce soit un bug VS? Je vais essayer de supprimer la dynamique pour voir si cela fonctionne –

+0

Oui, cela semble être un problème avec le débogueur, mais je ne peux pas le confirmer. –

+0

J'ai mis à jour le même code pour utiliser une classe typée statiquement et a très bien fonctionné. Il semble que ce soit un bug en dynamique alors. attendra de voir si quelqu'un trouve une solution pour que cela fonctionne avec dynamique, sinon je vais définir votre réponse comme correcte. Degrés mérités en attendant –