4

这个问题是关于标识符中的字符,而不是关键字作为标识符

在 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 @>

在命名测试之外,我看不出它有多大用处,但这让我想知道:类型和模块名称支持哪些字符,成员名称和 let 绑定支持哪些字符?

一些测试:

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# 本身施加的?

4

1 回答 1

4

查看F# 语言规范 4.0 - In 部分3.4 Identifiers and Keywords

请注意,当标识符用于类型、联合类型大小写、模块或命名空间的名称时,即使在双反引号内也不允许使用以下字符:
., +, $, &, [, ], /, \\, *, \",`

除了这个列表之外,@(at-sign) 可以在任何名称中使用,但会引发警告:

警告 FS1104:包含“@”的标识符保留用于 F# 代码生成

在我能找到的附近:

可以在 F# 编译器中找到名称为IllegalCharactersInTypeAndNamespaceNames的字符列表。

由于这用于生成 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)
或字符_, $, @, `(重音),和?

于 2016-12-22T02:04:45.587 回答