此问题与标识符中的字符有关,而不是keywords as identifiers。
我找到this question on C# names,但在F#上找不到相同内容。通常情况下,这几乎不相关,但在我的测试命名中,我经常使用点.
,并且很惊讶它在模块名称中不受支持,但在let-binding中受支持:
// fails:
module ``Run Test.Me functions`` =
[<Test>]
let ``X.Add should add``() = test <@ X.Add 2 2 = 4 @>
// Succeeds
module ``Run Test-Me functions``
[<Test>]
let ``X.Add should add``() = test <@ X.Add 2 2 = 4 @>
除了命名测试之外,我没有看到太多用途,但它让我想知道:类型和模块名称支持哪些字符,成员名称和绑定的字符是什么?
一些测试:
module ``Weird.name`` = () // fails
module ``Weird-name`` = () // succeeds
module ``Weird()name`` = () // succeeds (?)
module ``Weird*name`` = () // fails
module ``Weird+name`` = () // fails
module ``Weird%name`` = () // succeeds (?)
module ``Weird/name`` = () // fails
module ``Weird\\name`` = () // fails
所有这些名称都在let-binding或成员名称中成功,但不是作为类型名称或模块名称。至少这是一致的。但是我无法在允许的内容中找到任何行或逻辑,而不是
CLR / MSIL可能会受到限制,而F#本身也不会这样做?
答案 0 :(得分:4)
查看F# Language Specification 4.0 - 在3.4 Identifiers and Keywords
部分。
请注意,当标识符用于类型名称时,将使用union 键入大小写,模块或命名空间,以下字符不是 即使在双重反击标记内也允许:
.
,+
,$
,&
,[
,]
,/
,\\
,{{ 1}},*
,\"
除此列表外,任何名称都允许使用`
(at-sign),但会发出警告:
警告FS1104:包含“@”的标识符保留用于F#代码生成
尽我所能:
可以在名为IllegalCharactersInTypeAndNamespaceNames的F#编译器中找到字符列表。
由于这用于生成IL,导致ECMA-335 - Common Language Infrastructure (CLI) Partitions I to VI读取:
II.5.3标识符 - 标识符用于命名实体。简单 标识符等同于ID。但是,ILAsm语法允许 使用可以使用Unicode形成的任何标识符 字符集(见分区I)。为此,标识符应该 放在单引号内。
ID是一个连续的字符串,以一个字母开头 字母字符(A-Z,a-z)
或其中一个@
,_
,$
,@
(重音符号)或`
,
然后是任意数量的 字母数字字符(A-Z,a-z,0-9)
或字符?
,_
,$
,@
(重音符号)和`