2011-11-16 189 views
14

我注意到,在调试C#项目和VB.NET项目时,VS 2010中的直接窗口行为有所不同,尽管我一直无法找到任何特定的文档这种差异。C#和VB.NET中的立即窗口行为差异

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

foo.bar打字== “baz” 的

将输出

在VB.NET,H不管怎样,做同样的事情什么都不输出。

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

foo.bar = “巴兹”

编辑的清晰度和我的坏榜样,上面:

所有其他的表情表现出相同的行为,包括简单的数学这样的作为'1 + 2'。有时候错误信息是不同的,因为1 + 2导致错误'数字标签必须跟着冒号。'

有没有办法'修复'这种行为,并使VB.NET立即窗口行为更像C#之一?必须输入一个?在每一个陈述面前经常使用它会是一件痛苦的事情。

回答

14

即时窗口的语义只是不同。在C#中,评估输入的任何表达式或语句,并将评估结果打印到窗口中。在VB.NET中,你必须输入一个完整的语句;你不能输入裸露的表情。在你的例子中,如你所发现的,如果你想在窗口上打印任何东西,你需要使用“打印”语句(别名为?)。

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

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

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

+0

谢谢,这非常合理。这仍然是一个痛苦,尤其是对于简单的房地产评估。 –

+1

所以基本上,只要在陈述 – levininja

+0

@levininja的前面加一个'?';这个问题或多或少是“为什么这是必要的?” – phoog

5

立即窗口解析器期望语句如果您不使用?命令。命令

foo.bar = "baz" 

在vb中是合法的。净,它是一个赋值语句,给出对象foo的字段或属性“baz”的值。但是,如果酒吧是该类的一种方法,但是会抱怨。同样,“1 + 2”在vb.net中不是一个有效的语句,命令帮助解释者理解你打算评估一个表达。要将赋值运算符从赋值语句转换为比较运算符,必​​须使解析器明白表达式正在被计算。 ?需要。对于“1 + 2”同样的事情,vb.net语句解析器接受一个语句开头的数字作为语句标签,适合GoTo。

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

+0

感谢您的额外澄清! –