序列.(
是否可以出现在C#或VB.Net代码中?
(不是字符串,注释或XML文字,编辑:或预处理程序指令)
我有理由确定答案是否定的,但我想确定。
答案 0 :(得分:22)
.
出现在语法中的唯一地方是:
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
(......意味着我已经省略了生产规则的其余部分。)在这些情况下,.(
无效,.
后跟数字,有效标识符或关键字this
。
答案 1 :(得分:20)
在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#语言规范版本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
仅用于词法分析,因此没有任何迹象表明.
是合法的,后面是常规代码中的(
。
当然,由于你已经知道这些,我还会留下评论,文字等等。
答案 2 :(得分:10)
没有参考语法而且完全不科学,但这是我的猜测:
.(
在C#中不合法(不能代表VB.NET)。
在评论和字符串文字之外,我认为 .
只能显示为:
(
开头,因此不行。(
不是数字。最后,.
运营商is not overloadable,foo.(bar)
也不会有效。
答案 3 :(得分:6)
仔细阅读VB参考资料后,我现在有信心 VB的答案是。
VB只使用字符.
来做三件事:浮点数文字内部以及成员访问和嵌套名称访问。
除了XML文字之外,唯一可能出现在成员访问之后的是IdentifierOrKeyword
(§1.105.6)。标识符定义非常明确,它们可能只以字母,下划线开头,或者在转义标识符的情况下,以[
开头。
嵌套名称访问也是如此(为了完整起见,也在With
块和字段初始化器中)。
至于浮点文字,那里必须后面至少还有一个数字(§1.6.3)。
答案 4 :(得分:4)
在此页面上http://blogs.msdn.com/b/lucian/archive/2010/04/19/grammar.aspx我以机器可读格式(EBNF& ANTLR)和人类可读(HTML)为C#4和VB10提供了完整语法的副本。 HTML版本包括为每个令牌设置的计算“可以跟随”。
根据这一点,“可能跟随”的PERIOD集合不包括C#4或VB10中的LPAREN。
不幸的是语法并不完整。然而,在VB / C#团队中,这些语法是我们开始进行大量分析的。例如......
VB10引入了“Sub()STMT”形式的“单行语句lambdas”。 lambda本身是一个表达式,可以出现在例如列表中。 “Dim array = {Sub()STMT1,Sub()STMT2}”。我们必须意识到表达之后发生的事情以及发表声明之后发生的事情的模糊性。例如,“Dim x = Sub()Dim y = 5,z = 3”是不明确的,因为“z = 3”可能是第一个或第二个Dim的一部分。
VB10引入了“隐式线路延续”功能,这或多或少类似于允许C#在源代码中的任何位置包含SEMICOLON。我们必须弄清楚这是否会引入任何含糊之处。这相当于询问语言中任何句子的前缀本身是否也是有效句子。这相当于确定两个无上下文语言的交集是否为空。这通常是一个不可判定的问题,但不是VB语法的情况,我们可以通过对算法的额外“人类洞察力”来决定。
答案 5 :(得分:2)
我认为他们不会向C#添加这样的内容,只是看起来很简单。
但是,我对VB.Net一点也不确定。只是看看他们如何做仿制药,似乎VB.Net团队没有这种“看起来不那么奇怪”的态度。因此,如果您构建任何可以与这些语言的未来版本一起使用的工具,那么最好注意VB.Net ......