15

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

对于 C# 项目,我可以简单地键入任何表达式,它将被评估和显示,即键入

foo.bar == "baz"

将输出

错误的

然而,在 VB.NET 中,做同样的事情不会产生任何结果。

我必须在表达式前面加上一个问号才能使它起作用。

?foo.bar = "baz"

错误的

为清楚起见进行编辑,以及我上面的坏例子:

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

有没有办法“修复”这种行为并使 VB.NET 即时窗口的行为更像 C# 窗口?必须输入一个?经常使用它时,每条语句的前面都会很痛苦。

4

2 回答 2

14

直接窗口的语义只是不同。在 C# 中,您输入的任何表达式或语句都会被计算,并且计算结果会打印到窗口中。在 VB.NET 中,您必须输入完整的语句;你不能输入一个简单的表达式。?如您所见,在您的示例中,如果要将任何内容打印到窗口,则需要使用“打印”语句(别名为)。

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

赋值在 VB.NET 中没有值;a = b = 4意思是“评估 b 是否等于 4,并将评估的结果分配给 a。” 这意味着 a 将等于真或假。

在C#中,赋值也是一个有值的表达式,所以a = b = 4意思是“把值4赋给b,把表达式(b = 4)的值赋给a”。这意味着 a 将等于 4。

于 2011-11-17T00:02:10.197 回答
5

如果您不使用? 命令。命令

foo.bar = "baz"

在 vb.net 中是合法的,它是一个赋值语句,赋予对象 foo 的bar字段或属性值“baz”。但是,如果bar是该类的方法,它会抱怨。同样,“1+2”在 vb.net 中不是有效语句,? command 帮助解释器理解你的意思是评估一个表达式。要将 = 运算符从赋值变为比较运算符,您必须让解析器了解正在计算表达式。? 必需的。“1+2”也是一样,vb.net 语句解析器接受语句开头的数字作为语句标签,适合 GoTo。

C# 语言遵循花括号语言标准,其中任何表达式也是有效语句。所以“1+2”在没有帮助的情况下被解释为有效的陈述?这也是它需要一个单独的等式运算符 (==) 符号的原因,否则解析器不会知道赋值语句和表达式之间的区别。

于 2011-11-17T00:17:39.210 回答