我注意到VS 2010中的即时窗口在调试c#项目和VB时表现不同。. NET项目,虽然我还没能找到任何关于这个差异的具体文档。
对于c#项目,我可以简单地输入任何表达式,它将被计算和显示,即输入
foo。Bar == "baz"
将输出
假
VB。然而,做同样的事情,NET没有输出任何东西。
我必须在表达式前面加一个问号才能使它工作。
? foo。Bar = "baz"
假
为清晰而编辑,我上面的坏例子:
所有其他表达式都表现出相同的行为,包括简单的数学运算,如'1 + 2'。但有时错误信息是不同的,因为1 + 2会导致错误"数字标签必须后跟冒号"。
是否有一种方法来"修复"这个行为,使VB。. NET立即窗口的行为更像c#吗?必须输入a ?如果频繁使用,在每条语句前使用它会很麻烦。
直接窗口的语义是不同的。在c#中,您输入的任何表达式或语句都会被求值,并且求值的结果会打印到窗口中。在VB。NET,你必须输入一个完整的语句;你不能输入一个纯表达式。在您的示例中,正如您所发现的,如果您想要将任何内容打印到窗口,则需要使用'Print'语句(其别名为?
)。
其中一个原因是语言的语义不同。正如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。
如果不使用?命令。命令
foo.bar = "baz"
在vb.net中是合法的,它是一个赋值语句,赋予bar字段或对象foo的属性值"baz"。然而,如果bar是类的方法,它将会报错。类似地,"1+2"在vb.net中不是一个有效的语句。命令可以帮助解释器理解您要对表达式求值。要将=操作符从赋值转换为比较操作符,必须使解析器理解正在对表达式求值。? 必需的。对于"1+2"也是一样,vb.net语句解析器在语句开始处接受一个数字作为语句标签,适合GoTo。
c#语言遵循大括号语言标准,其中任何表达式都是有效语句。所以"1+2"被解释为一个有效的陈述,没有帮助?这也是相等操作符(==)需要单独符号的原因,否则解析器将无法知道赋值语句和表达式之间的区别。