条件断点在 Visual Studio 2015 中不起作用
Conditional breakpoint not working in Visual Studio 2015
我在 Visual Studio 2015 年调试我的 C# 代码时遇到问题。
我想在断点中添加一个简单的表达式,
所以我添加了hierarchyRelation != null
作为条件。那是我正在调试的方法的一个局部变量,它是存在的。
但是,在运行时我得到以下错误
"The condition for a breakpoint failed to execute. The condition was
"hierarchyRelation != null". The error returned was "The breakpoint
condition must evaluate to a boolean operation". Click OK to stop at
this breakpoint.
实际上,情况更复杂,但这是重现问题的最简单的情况。我尝试了变体,甚至比较了这个变量的属性,但它总是失败。
如果我尝试一个恒定的条件,如 1 != 2
或 1 = 1
,它工作正常。有什么问题吗?我找到的最接近的相关问题是 ,但它在 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
的第一行添加断点
问题是 hierarchyRelation
是一个动态变量,尽管我不完全确定为什么。根据 Expressions in the Debugger 它应该可以工作(我找不到不应该的原因)。
static void Main(string[] args)
{
dynamic foo = new Foo();
// conditional breakpoint 'foo.Nodes == null' here
}
internal class Foo
{
public IEnumerable<Foo> Nodes = null;
}
每当调试器通过并评估条件断点时,此代码都会触发相同的异常。静态输入 foo
变量将使调试器能够计算表达式并在需要时中断。
晚会有点晚了,但无论如何,我也遇到了同样的问题,也有一个动态对象。
我解决这个问题的方法是将其转换为断点条件表达式本身中的一个对象;所以在你的情况下,执行以下操作会起作用:
(object)hierarchyRelation!=null
试一试,看看是否适合您。
我在 Visual Studio 2015 年调试我的 C# 代码时遇到问题。
我想在断点中添加一个简单的表达式,
所以我添加了hierarchyRelation != null
作为条件。那是我正在调试的方法的一个局部变量,它是存在的。
但是,在运行时我得到以下错误
"The condition for a breakpoint failed to execute. The condition was "hierarchyRelation != null". The error returned was "The breakpoint condition must evaluate to a boolean operation". Click OK to stop at this breakpoint.
实际上,情况更复杂,但这是重现问题的最简单的情况。我尝试了变体,甚至比较了这个变量的属性,但它总是失败。
如果我尝试一个恒定的条件,如 1 != 2
或 1 = 1
,它工作正常。有什么问题吗?我找到的最接近的相关问题是 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
问题是 hierarchyRelation
是一个动态变量,尽管我不完全确定为什么。根据 Expressions in the Debugger 它应该可以工作(我找不到不应该的原因)。
static void Main(string[] args)
{
dynamic foo = new Foo();
// conditional breakpoint 'foo.Nodes == null' here
}
internal class Foo
{
public IEnumerable<Foo> Nodes = null;
}
每当调试器通过并评估条件断点时,此代码都会触发相同的异常。静态输入 foo
变量将使调试器能够计算表达式并在需要时中断。
晚会有点晚了,但无论如何,我也遇到了同样的问题,也有一个动态对象。
我解决这个问题的方法是将其转换为断点条件表达式本身中的一个对象;所以在你的情况下,执行以下操作会起作用:
(object)hierarchyRelation!=null
试一试,看看是否适合您。