我注意到VS 2010中的即时窗口在调试C#项目和VB.NET项目时表现不同,尽管我还没有找到任何关于这种差异的具体文档。
对于C#项目,我只需输入任何表达式,它就会被评估和显示,即输入
foo.bar ==“baz”
将输出
假
然而,在VB.NET中,做同样的事情什么都不输出。
我必须在表达式前面加上一个问号才能使用。
?foo.bar =“baz”
假
为了清晰起见而编辑以及我上面的错误示例:
所有其他表达式都表现出相同的行为,包括简单的数学运算,例如'1 + 2'。有时错误信息是不同的,因为1 + 2导致错误'数字标签必须跟冒号。'
有没有办法'修复'这种行为并使VB.NET立即窗口的行为更像C#?不得不输入?在经常使用它时,在每个陈述面前都会很痛苦。
答案 0 :(得分:14)
即时窗口的语义是不同的。在C#中,将评估您输入的任何表达式或语句,并将评估结果打印到窗口中。在VB.NET中,您必须输入完整的语句;你不能输入一个裸露的表达。在您的示例中,如您要发现的那样,如果要在窗口中打印任何内容,则需要使用“打印”语句(别名为?
)。
这样做的一个原因是语言的语义不同。正如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。
答案 1 :(得分:5)
如果您不使用?立即窗口解析器需要语句?命令。命令
foo.bar = "baz"
在vb.net中是合法的,它是一个赋值语句,赋予对象foo的 bar 字段或属性值“baz”。然而,如果 bar 是一个类的方法,它会抱怨。同样,“1 + 2”在vb.net中不是有效的声明,?命令帮助解释器理解您要评估表达式。要将=运算符从赋值转换为比较运算符,必须使解析器理解正在计算表达式。 ?需要。对于“1 + 2”,vb.net语句解析器在语句的开头接受一个数字作为语句标签,适合GoTo。
C#语言遵循大括号语言标准,其中任何表达式也是有效语句。所以“1 + 2”在没有帮助的情况下被解释为有效的陈述?这也是它需要一个单独的符号用于相等运算符(==)的原因,解析器不会知道赋值语句和表达式之间的区别。