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

Mar*_*ill 15 c# vb.net immediate-window visual-studio-2010

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

对于C#项目,我只需输入任何表达式,它就会被评估和显示,即输入

foo.bar =="baz"

将输出

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

我必须在表达式前加一个问号才能使它工作.

?foo.bar ="baz"

编辑为清晰起见,上面我的坏例子:

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

有没有办法'修复'这种行为并使VB.NET立即窗口的行为更像C#?不得不输入?在经常使用它时,在每个声明面前都会很痛苦.

pho*_*oog 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.


Han*_*ant 5

如果您不使用?,立即窗口解析器需要一个语句?命令.命令

foo.bar = "baz"
Run Code Online (Sandbox Code Playgroud)

在vb.net中是合法的,它是一个赋值语句,给对象foo的bar字段或属性赋值"baz".然而,如果酒吧是班级的一种方法,它会抱怨.同样,"1 + 2"在vb.net中不是有效的声明,?命令帮助解释器理解您要评估表达式.要将=运算符从赋值转换为比较运算符,必​​须使解析器理解正在计算表达式.?需要.对于"1 + 2",vb.net语句解析器在语句的开头接受一个数字作为语句标签,适合GoTo.

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