2011-11-16 7 views
14

He notado que la ventana inmediata en VS 2010 se comporta de manera diferente al depurar un proyecto C# y un proyecto VB.NET, aunque no he podido encontrar ninguna documentación específica de esta diferenciaDiferencias en el comportamiento de las ventanas inmediatas en C# y VB.NET

Para proyectos C#, puedo simplemente escriba en cualquier expresión, y serán evaluados y se muestra, es decir, escribir en

foo.bar == "baz"

salida voluntad

falsa

En VB.NET, h sin embargo, hacer lo mismo no produce nada.

Tengo que poner un signo de interrogación delante de la expresión para que funcione.

foo.bar = "Baz"

falsa

Editar para mayor claridad y mi mal ejemplo anterior:?

Todas las demás expresiones presentan el mismo comportamiento, incluyendo operaciones matemáticas sencillas, tales como '1 + 2'. A veces, el mensaje de error es diferente, ya que 1 + 2 da como resultado el error "Las etiquetas que son números deben ir seguidas de dos puntos".

¿Hay alguna forma de 'corregir' este comportamiento y hacer que la ventana inmediata de VB.NET se comporte más como la de C#? ¿Tener que escribir un? frente a cada declaración puede ser un problema cuando se usa con frecuencia.

Respuesta

14

La semántica de las ventanas inmediatas son simplemente diferentes. En C#, cualquier expresión o declaración que ingrese se evalúa y el resultado de la evaluación se imprime en la ventana. En VB.NET, debe ingresar una declaración completa; no puedes ingresar una expresión simple En su ejemplo, como descubrió, debe usar la instrucción 'Imprimir' (el alias para el cual es ?) si desea imprimir algo en la ventana.

Una razón para esto es que la semántica de los idiomas es diferente. Como mencionó Bob Kaufman, = puede ser un operador de asignación o una prueba de igualdad. Si la ventana de VB.NET funcionara como la ventana C#, no habría forma de determinar si a = b significaba "asignar b a a" o "evaluar si b es igual a".

Las asignaciones no tienen un valor en VB.NET; a = b = 4 significa "evaluar si b es igual a 4 y asignar el resultado de esa evaluación a a". Esto significa que una voluntad será igual a verdadero o falso.

En C#, una asignación también es una expresión con un valor, por lo que a = b = 4 significa "asignar el valor 4 a by asignar el valor de la expresión (b = 4) a a". Esto significa que a será igual a 4.

+0

Gracias, eso tiene mucho sentido. Sin embargo, todavía es un dolor, especialmente para una simple evaluación de propiedades. –

+1

Así que básicamente, simplemente ponga un '?' Delante de sus declaraciones – levininja

+0

@levininja absolutamente; la pregunta es más o menos "¿por qué es necesario?" – phoog

5

El analizador de ventanas inmediato espera una declaración si no utiliza? mando. El comando

foo.bar = "baz" 

es legal en vb.net, es una declaración de asignación, que proporciona bar campo o propiedad del objeto foo el valor "baz". Sin embargo, se va a quejar si bar es un método de la clase. Del mismo modo, "1 + 2" no es una declaración válida en vb.net, el? El comando ayuda al intérprete a comprender que pretendía evaluar una expresión. Para convertir el operador = de una tarea en un operador de comparación, debe hacer que el analizador comprenda que se está evaluando una expresión. ? necesario. Lo mismo para "1 + 2", el analizador de declaraciones de vb.net acepta un número al comienzo de una declaración como una etiqueta de declaración, adecuada para un GoTo.

El lenguaje C# sigue el estándar de las llaves de llaves donde cualquier expresión también es válida. Entonces, "1 + 2" se interpreta como una declaración válida sin ayuda de? Lo cual es también la razón por la que necesita un símbolo separado para el operador de igualdad (==), un analizador no conocería la diferencia entre una declaración de asignación y una expresión.

+0

¡Gracias por la aclaración adicional! –

Cuestiones relacionadas