C#和VB.NET中立即窗口行为的差异

15

我注意到在调试C#项目和VB.NET项目时,VS 2010中的即时窗口表现不同,尽管我没有找到任何关于这种差异的具体文档。

对于C#项目,我可以直接输入任何表达式,它将被计算并显示,例如输入

foo.bar == "baz"

会输出

false

然而,在VB.NET中,做同样的事情什么也不输出。

我必须在表达式前面加一个问号才能让它工作。

?foo.bar = "baz"

false

编辑以使上面的内容更清晰:

所有其他表达式都表现出相同的行为,包括简单的数学运算,如“1 + 2”。但有时错误消息是不同的,例如1 + 2的结果是错误“数字标签必须后跟冒号。”

是否有一种方法可以“修复”这种行为,使VB.NET的即时窗口更像C#的即时窗口?当频繁使用它时,在每个语句前面都要键入问号可能会很麻烦。

2个回答

14

立即窗口的语义是不同的。在C#中,您输入的任何表达式或语句都会被评估,评估结果将打印到窗口中。在VB.NET中,您必须输入完整的语句;您不能输入裸露的表达式。在您的示例中,正如您发现的那样,如果您想要将任何内容打印到窗口中,则需要使用“Print”语句(其别名为?)。

其中一个原因是语言的语义不同。正如Bob Kaufman所提到的,=可以是分配运算符或相等性测试。如果VB.NET窗口像C#窗口一样工作,则无法确定a = b是指“将b分配给a”还是“评估b是否等于a”。

在VB.NET中,分配没有值;a = b = 4表示“评估b是否等于4,并将该评估结果分配给a。”这意味着a将等于true或false。

在C#中,分配也是具有值的表达式,因此a = b = 4表示“将值4分配给b,并将表达式(b = 4)的值分配给a。”这意味着a将等于4。


谢谢,这基本上很有道理。不过,这仍然是个麻烦,尤其是对于简单的属性评估来说。 - Marty
1
所以基本上,只需在语句前面加上一个 ? - levininja
@levininja 当然可以;问题更多地是“为什么有必要这样做?” - phoog

5
即时窗口解析器要求您使用?命令以外的语句。命令是:
foo.bar = "baz"

在vb.net中,“=”是一个赋值语句,用于给对象foo的“bar”字段或属性赋值为“baz”。但如果“bar”是类的方法,则会出现错误。类似地,“1+2”不是vb.net中的有效语句,“?”帮助解释器理解您想要评估的表达式。要将“=”运算符从赋值变为比较运算符,必须让解析器理解正在评估一个表达式。需要“?”。同样对于“1+2”,vb.net语句解析器接受数字作为语句标签,适合于GoTo。
C#语言遵循花括号语言的标准,任何表达式也是有效的语句。因此,“1+2”被解释为有效语句,无需使用“?”来协助解释。这也是为什么它需要一个单独的符号(==)表示等式运算符的原因,否则解析器将无法区分赋值语句和表达式。

感谢额外的澄清! - Marty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接