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

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

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

foo.bar == "Баз"

будет выводить

ложный

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

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

? foo.bar = "baz"

ложный

Отредактируйте для ясности и мой плохой пример выше:

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

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

2 ответа

Решение

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

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

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

foo.bar = "baz"

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

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

Другие вопросы по тегам