.Net / CLR 标识符

4
我在想,.Net标识符可以接受哪些字符?
不是C#或VB.Net,而是CLR。
我之所以问这个问题,是因为我正在研究yield return语句的实现(参见深入理解C#),并发现它编译成以下代码:
public int <count>5__1;

是否有其他可用的标识字符?此代码不会公开。

2个回答

2
这是由CLS规范第8.5.1章“有效名称”所管理的:
CLS规则4:程序集应遵循Unicode标准3.0技术报告15的附录7,该报告管理允许在标识符中启动和包含的字符集,在线可用于http://www.unicode.org/unicode/reports/tr15/tr15-18.html。标识符应采用Unicode规范化形式C定义的规范格式。对于CLS目的,如果两个标识符的小写映射(由Unicode区域设置无关的一对一小写映射指定)相同,则它们相同。也就是说,为了使两个标识符在CLS下被视为不同,它们应该有更多不同之处,而不仅仅是大小写。但是,为了覆盖继承的定义,CLI要求使用原始声明的精确编码。
换句话说,它没有指定禁止字符列表,只关心能够比较字符串而没有惊喜。这就是CLR所必须做的全部工作。编译器的工作要困难得多,它必须能够识别程序中的标记,即词法分析器的工作。实际的词法分析器实现对标识符中的有效字符设置规则。例如,不能以数字开始标识符。

很好的回答,但请注意这是指定CLS要求,而不是CLR要求。 - kvb
我所知道的任何CLR实现都遵循CLS规则。 - Hans Passant
我不相信那是完全正确的;CLS规则指出编译器应该针对CLR行为的受限子集,以便与其他语言进行互操作(请参见规范的第I部分第7节)。然而,CLR显然支持非CLS兼容类型,并且规范明确提到,在程序集外部不可见的类型不需要遵循CLS规则。 - kvb
一些规则本身也表明了这一点。例如,规则5指出:“在符合CLS的范围内引入的所有名称都应该是独立的,无论种类如何,除非这些名称是相同的并且通过重载进行解析。也就是说,虽然CTS允许单个类型使用相同的名称作为方法和字段,但CLS不允许。” - kvb
你可以尝试创建一个违反这个规则的类型(例如通过Reflection.Emit或ilasm),运行时不会有任何问题。 - kvb

1

C#规范规定了可以使用哪些字符。

然而,CLR允许使用更多的字符。这就是为什么C#编译器会将它们作为这样的原因。


我期望CLR允许的内容在CLR规范中有定义。 - Richard
@Richard:当引用时,CLR几乎允许任何内容。例如:'!2ss<,'在IL中是有效的。 - leppie
非常有趣!这种行为是否也存在于旧版本的CLR中? - Darkzaelus
据我所知,是的,一直到1.0版本。 - leppie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接