条件断点和观察窗口不进行短路表达式评估

时间:2016-05-23 10:46:36

标签: c# .net visual-studio visual-studio-2015

[编辑 - 改变示例,以避免混淆根本问题]

在尝试解决为什么我的条件断点在Visual Studio中不断产生错误时,我偶然发现了一个我没想到的行为。

在监视窗口,即时窗口或断点条件下,Visual Studio似乎没有短路表达式评估。

例如,在此之后停在该行的断点处:

string obj = "hello";

并在观察窗口中评估以下内容

obj is int && ((int)obj) == 1

应该给出结果

false

但是给出了

  

CS0030:无法将类型'string'转换为'int'

这使我无法检查对象的类型,然后转换为该类型并检查条件断点中的属性,这严重降低了它们的实用性。

其他人是否看到此行为,是否有人知道如何使条件断点/观察窗口短路?

我提出的一个不太理想的解决方法是将表达式包装在代码中的方法中,并从监视窗口进行评估。但是,这涉及更改代码和重新编译,而不是在调试时动态更改条件。

2 个答案:

答案 0 :(得分:2)

实际上,这个陈述不会在即时窗口或代码中起作用,因为编译器知道int永远不会被转换为object

如果您将obj定义为object obj = "hello"; bool result = obj is int && ((int)obj) == 1; ,它将按预期工作。

(int)(object) obj

上面的代码将编译并作为断点条件工作。

正如leppie所提到的,你可以重新投射你的物体(Countdown)以避免这种情况,但这应该是最后的手段。

答案 1 :(得分:1)

我试图打破价值类型为object

的通用属性设置器时遇到了同样的问题
(propertyName=="xxx") && (value is int) && ((int)value==5000)

更换第二个&&使用?:运算符似乎可以解决问题

(propertyName=="xxx") && ((value is int) ? ((int)value==5000) : false)