В C # сегмент #region
позволяет любым символам следовать за ним:
#region foo.(
// this is perfectly legal C#
#endregion
Обратите внимание, что в VB.Net это не имеет значения, поскольку метка региона должна быть допустимым строковым литералом,поэтому он имеет кавычки:
#Region "foo.("
' quotes required
#End Region
Это также допустимо после #error
и #warn
, которые не имеют VB-эквивалента.
Однако самое большое беспокойство - это то, что вы можете иметь любой произвольныйкод внутри блока #if
.В C #:
#if false
foo.( perfectly legal
#endif
В VB.Net:
#If False Then
foo.( perfectly legal
#End If
На самом деле это еще хуже, потому что версия VB допускает произвольные выражения, поэтому вы не можете знать, является ли какой-то код на самом делеVB, если вы не оцениваете выражения.Другими словами, одного разбора недостаточно - вам тоже нужно оценить.
При этом, анализируя грамматику в C # Language Specification Version 4.0, Приложение B, символ .
появляется в следующих строках:
real-literal:
decimal-digits . decimal-digits exponent-partopt real-type-suffixopt
. decimal-digits exponent-partopt real-type-suffixopt
operator-or-punctuator: one of
{ } [ ] ( ) . , : ;
namespace-or-type-name:
namespace-or-type-name . identifier type-argument-listopt
member-access:
primary-expression . identifier type-argument-listopt
predefined-type . identifier type-argument-listopt
qualified-alias-member . identifier
base-access:
base . identifier
unbound-type-name:
unbound-type-name . identifier generic-dimension-specifieropt
qualified-identifier:
qualified-identifier . identifier
member-name:
interface-type . identifier
indexer-declarator:
type interface-type . this [ formal-parameter-list ]
Поскольку за .
всегда следует десятичная цифра, идентификатор или маркер this
, единственный способ получить последовательность .(
состоит в том, чтобы разрешить несколько operator-or-punctuator
символы рядом друг с другом.Посмотрев на operator-or-punctuator
, мы увидим:
token:
operator-or-punctuator
Поскольку token
используется только в лексическом анализе, нет никаких оснований предполагать, что .
является допустимым, за которым следует (
в обычном коде.
Конечно, это все еще оставляет комментарии, литералы и т. Д., Которые я опускаю, потому что вы уже знаете о них.