这个问题是关于标识符中的字符,而不是keywords as identifiers。我发现this question on C# names,但在F#上找不到相同的东西。通常,这是没有什么关系的,但是在我的测试命名我经常使用的点.
,惊讶它不是在一个模块名称支持,但在let结合支持:命名测试F#标识符,模块,类型和成员名称中允许使用哪些字符?
// 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
所有这些名字在让结合或成员名成功,但不是一个类型名称或模块名称。至少这是一致的。但是我找不到任何行或逻辑,什么是允许的,什么不是。
也许限制是由CLR/MSIL而不是由F#本身?
@guy,我碰巧在另一个屏幕上打开了lang spec,不知道为什么我没有发现它。你可能想把它变成一个答案,即使有人可以在规范中找到答案,也不要认为它应该在这里作为问答(尽管如此,这件事很难阅读!) – Abel