Непосредственные различия в поведении окна в С# и VB.NET

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

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

foo.bar == "baz"

выводит

ложно

В VB.NET, однако, то же самое ничего не выводит.

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

? foo.bar = "baz"

ложно

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

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

Есть ли способ "исправить" это поведение и сделать непосредственное окно VB.NET более похожим на С#? Нужно набрать? перед каждым выражением может быть боль при частом использовании.

Ответ 1

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

Одна из причин этого заключается в том, что семантика языков различна. Как отметил Боб Кауфман, = может быть оператором присваивания или тестом равенства. Если окно VB.NET работало подобно окну С#, не было бы способа определить, означает ли a = b "присваивать b a" или "оценивать, является ли b равным a".

Задания не имеют значения в VB.NET; a = b = 4 означает "оценить, является ли b равным 4, и присвоить результат этой оценки a". Это означает, что a будет либо равно true, либо false.

В С# присваивание также является выражением со значением, поэтому a = b = 4 означает "присваивать значение от 4 до b и присваивать значение выражения (b = 4)". Это означает, что a будет равно 4.

Ответ 2

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

foo.bar = "baz"

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

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