【发布时间】:2017-05-07 13:52:13
【问题描述】:
这个问题是关于标识符中的字符,而不是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 @>
在命名测试之外,我看不出它有多大用处,但它让我想知道:类型和模块名称支持哪些字符,成员名称和 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# 本身施加的?
【问题讨论】:
-
@guy,我碰巧在我的另一个屏幕上打开了语言规范,不知道为什么我没有发现它。你可能想把它变成一个答案,即使有人可以在规范中找到它,也不要认为把它作为问答放在这里应该是不好的(但是,老实说,那东西很难阅读!)
标签: f# clr member naming let-binding