Непосредственные различия в поведении окон в C # и VB.NET - PullRequest
15 голосов
/ 17 ноября 2011

Я заметил, что непосредственное окно в VS 2010 ведет себя по-разному при отладке проекта C # и проекта VB.NET, хотя я не смог найти какой-либо конкретной документации об этой разнице.

Для проектов на C # я могу просто ввести любое выражение, и оно будет оценено и отображено, то есть введя

foo.bar == "Баз"

выдаст

1012 * ложь *

Однако в VB.NET выполнение одной и той же операции ничего не дает.

Мне нужно поставить вопросительный знак перед выражением, чтобы оно работало.

? Foo.bar = "baz"

ложь

Изменить для ясности и мой плохой пример выше:

Все остальные выражения демонстрируют такое же поведение, включая простую математику, такую ​​как «1 + 2». Иногда сообщение об ошибке отличается, так как 1 + 2 приводит к ошибке «За метками, которые являются числами, должны следовать двоеточия».

Есть ли способ «исправить» это поведение и заставить непосредственное окно VB.NET вести себя как C #? Нужно ввести? перед каждым утверждением может возникнуть боль при частом его использовании.

Ответы [ 2 ]

14 голосов
/ 17 ноября 2011

Семантика ближайших окон просто другая. В C # любое введенное вами выражение или выражение оценивается, а результат оценки выводится в окно. В VB.NET вы должны ввести полный оператор; Вы не можете ввести голое выражение. В вашем примере, как вы обнаружили, вам нужно использовать оператор «Печать» (псевдоним для которого ?), если вы хотите напечатать что-либо в окне.

Одна из причин этого заключается в том, что семантика языков различна. Как отметил Боб Кауфман, = может быть оператором присваивания или тестом на равенство. Если бы окно 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». Это означает, что а будет равно 4.

5 голосов
/ 17 ноября 2011

Средство синтаксического анализа непосредственного окна ожидает оператор , если вы не используете? команда. Команда

foo.bar = "baz"

допустимо в vb.net, это оператор присваивания, задающий для поля bar или свойства объекта foo значение "baz". Однако он будет жаловаться, если bar является методом класса. Точно так же «1 + 2» не является допустимым утверждением в vb.net, символ? Команда помогает интерпретатору понять, что вы хотели оценить для выражения. Чтобы превратить оператор = из присваивания в оператор сравнения, вы должны дать синтаксическому анализатору понять, что выражение вычисляется. ? требуется. То же самое для "1 + 2", синтаксический анализатор операторов vb.net принимает число в начале оператора как метку оператора, подходит для GoTo.

Язык C # следует стандарту языка фигурных скобок, где любое выражение также является допустимым утверждением. Таким образом, «1 + 2» интерпретируется как правильное утверждение без помощи? По этой же причине необходим отдельный символ для оператора равенства (==), иначе парсер не знал бы разницу между оператором присваивания и выражением.

...