La séquence .(
jamais apparaître en code C # ou VB.Net?
(Pas dans une chaîne, un commentaire ou un littéral XML, EDIT : ou une directive de préprocesseur)
Je suis raisonnablement certain que la réponse est non, mais je voudrais m'en assurer.
La séquence .(
jamais apparaître en code C # ou VB.Net?
(Pas dans une chaîne, un commentaire ou un littéral XML, EDIT : ou une directive de préprocesseur)
Je suis raisonnablement certain que la réponse est non, mais je voudrais m'en assurer.
Les seuls endroits où .
apparaissent dans la grammaire sont:
real-literal:
decimal-digits . decimal-digits ...
. decimal-digits ...
namespace-or-type-name:
namespace-or-type-name . identifier ...
member-access:
primary-expression . identifier ...
predefined-type . identifier ...
qualified-alias-member . identifier ...
base-access:
base . identifier
unbound-type-name:
unbound-type-name . identifier
qualified-identifier:
qualified-identifier . identifier
member-name:
interface-type . identifier
indexer-declarator:
type interface-type . this
(Le ... signifie que j'ai élidé le reste de la règle de production.) Dans aucun de ces cas, un .(
n'est valide car .
est soit suivi de chiffres, d'un identifiant valide, ou le mot clé this
.
En C#, un #region
segment permet à tous les caractères de la suivre:
#region foo.(
// this is perfectly legal C#
#endregion
Notez que dans VB.Net ce n'est pas un problème parce que la région de l'étiquette doit être un littéral de chaîne, donc il y a des guillemets:
#Region "foo.("
' quotes required
#End Region
C'est aussi juridique après l' #error
et #warn
qui n'ont pas de VB équivalent.
La plus grande préoccupation, cependant, est que vous pouvez avoir n'importe quel code à l'intérieur d'un #if
bloc. En C#:
#if false
foo.( perfectly legal
#endif
Dans VB.Net:
#If False Then
foo.( perfectly legal
#End If
C'est en fait pire que ça, parce que la version de visual basic permet arbitraire expressions de sorte que vous ne pouvez pas savoir si un code est en fait de VB à moins que vous évaluez les expressions. En d'autres termes, l'analyse seule ne suffit pas-vous avez à évaluer trop.
Cela dit, l'analyse de la grammaire dans la Spécification du Langage C# 4.0, Annexe B, .
ce caractère apparaît dans les lignes suivantes:
réel littérale: décimal chiffres . virgule-les chiffres de l'exposant-partopt réel de type suffixopt . virgule-les chiffres de l'exposant-partopt réel de type suffixopt opérateur-ou-punctuator: l'un des { } [ ] ( ) . , : ; l'espace de noms ou de type-nom: l'espace de noms ou de type-nom . identificateur de type de l'argument-listopt membre d'accès: primary-expression . identificateur de type de l'argument-listopt prédéfinis de type . identificateur de type de l'argument-listopt qualifié-alias-membre . identificateur de de base-accès: de la base . identificateur de indépendant de type-nom: indépendant de type-nom . identificateur générique-dimension-specifieropt qualifiée de l'identificateur: qualifiée de l'identificateur . identificateur de membre-nom: interface-type . identificateur de indexeur-demande de déclaration: type d'interface-type . cette [ officiel-paramètres-liste ]
Depuis un .
est toujours suivi d'un chiffre décimal, un identifiant ou un this
jeton, la seule façon d'avoir un .(
de la séquence est de permettre à plusieurs operator-or-punctuator
symboles les uns à côté des autres. Regardant operator-or-punctuator
,, nous voyons:
token: opérateur-ou-punctuator
Depuis token
n'est utilisé que dans l'analyse lexicale, il n'y a rien à suggérer que l' .
juridique est suivie par un (
régulièrement de code.
Bien sûr, il reste des commentaires, des littéraux, etc. que je laisse sortir, parce que vous savez déjà à propos de ceux-ci.
Aucune référence à la grammaire et totalement non-scientifique, mais voici ce que je suppose:
.(
n'est pas légal en C# (ne peux pas parler pour VB.NET).
En dehors des commentaires et des littéraux de chaîne, je pense que .
, ne peut apparaître que:
(
, c'est un no go.(
n'est pas un chiffre.Enfin, l' .
opérateur n'est pas overloadable, alors foo.(bar)
ne fonctionne pas, soit.
Ayant lu le VB référence, je suis maintenant convaincu que la réponse à la VB est pas.
VB utilise le caractère .
, pour seulement trois choses: à l'intérieur de nombre à virgule flottante littéraux et pour l'accès des membres et imbriquées nom d'accès.
En laissant de côté les littéraux XML, la seule chose qui peut chaque apparaître derrière l'accès d'un membre est une IdentifierOrKeyword
(§1.105.6). Les identificateurs sont très bien définis et qu'ils ne pourront démarrer qu'avec des lettres, des traits de soulignement ou, dans le cas d'une fuite de l'identificateur, le caractère [
.
Il en va de même pour les sous nom d'accès (et, à des fins d'exhaustivité, également en With
blocs et champ initialisers).
Comme pour virgule flottante littéraux, le point, il doit être suivi par au moins un chiffre de plus (§1.6.3).
Sur cette page http://blogs.msdn.com/b/lucian/archive/2010/04/19/grammar.aspx j'ai mis une copie complète de la grammaire pour C#4 et VB10 en format lisible en machine (EBNF & ANTLR) et lisible (HTML). La version HTML inclut le calculées "peut-suit" définir pour chaque jeton.
Selon cette dernière, le "peut-suit" l'ensemble de la PÉRIODE ne comprend pas LPAREN en C#4 ou VB10.
Malheureusement, les grammaires ne sont pas tout à fait complète. Néanmoins, au sein de la VB/C# équipes, ces grammaires sont ce que nous commençons avec pour beaucoup de notre analyse. Par exemple...
VB10 introduit "une seule ligne d'instruction lambdas" de la forme "Sub() STMT". Un lambda en lui-même est une expression, et peut apparaître dans une liste par exemple "Dim tableau = {Sub() STMT1, Sub() STMT2}". Nous avons eu d'être conscient de l'ambiguïté au sujet de ce qui est arrivé après une expression et ce qui est venu après une déclaration. Par exemple, "Dim x = Sub() Dim y = 5, z = 3" est ambigu, car le "z=3" peut-être partie de la première OU de la deuxième Dim.
VB10 introduit "continuation de ligne implicite", qui est plus ou moins analogue permettant à C# pour inclure le point-VIRGULE n'importe où dans le code source. Nous avons dû comprendre si cette apportera toutes les ambiguïtés. C'est l'équivalent de demander si un préfixe d'une phrase dans la langue est également lui-même un jugement définitif. C'est l'équivalent de déterminer si l'intersection de deux contextes langues est vide. C'est un problème indécidable en général, mais pas dans le cas de la VB grammaire, de qui nous avons été en mesure de décider avec d'autres "compréhension de l'homme" dans l'algorithme.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.