条件断点在Visual Studio 2015中不起作用

时间:2017-10-05 13:27:35

标签: c# debugging visual-studio-2015 visual-studio-debugging

我在Visual Studio 2015中调试C#代码时出现问题。

我想在断点中添加一个简单的表达式,

所以我添加了hierarchyRelation != null作为条件。这是我正在调试的方法的局部变量,它存在。

但是,在运行时我收到以下错误

  

“断点的条件未能执行。条件是   “hierarchyRelation!= null”。返回的错误是“断点   condition必须求值为布尔运算“。单击OK停止   这个断点。

实际上,条件更复杂,但这是最简单的情况,可以重现问题。我尝试了变体,甚至比较了这个变量的属性,但总是失败了。

如果我尝试一个恒定的条件,例如1 != 21 = 1,它可以正常工作。有什么问题吗?我发现的最近的相关问题是this,但它位于vb code。它的解决方案是直接在代码中添加调试方法。虽然我可以这样做,但我想知道为什么这不起作用。

方法代码

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;
        }

我在foreach

内的第一行添加断点

enter image description here

2 个答案:

答案 0 :(得分:2)

问题是hierarchyRelation是一个动态变量,虽然我不完全确定原因。根据{{​​3}}它应该有效(我找不到它不应该的原因)。

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

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

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

每当调试器传递并评估条件断点时,此代码都会触发相同的异常。静态键入foo变量将使调试器能够在需要时评估表达式并中断。

答案 1 :(得分:1)

聚会晚了一点,但无论如何,我也遇到了同样的问题,也有一个动态物体。

我要解决的问题是将其强制转换为断点条件表达式本身中的一个对象。因此在您的情况下,请执行以下操作:

(object)hierarchyRelation!=null

试试看,看看是否可行。