F# nameof 运算符不是 first-class 函数

F# nameof operator not a first-class function

我在我的项目文件中使用 F# 4.7 和 <LangVersion>preview</LangVersion>

我有这样的类型:

type Record = {
  Name : string
  Description : string
  FieldNotInterestedIn: int
}

我想以类型安全的方式获取某些字段的名称,但不是全部。我知道我可以使用反射获取所有字段名称。

这是我想出的最简洁的代码。能再简洁点吗?

let certainFieldNames =
  let r = Unchecked.defaultof<Record>
  
  [
    nameof r.Name
    nameof r.Description
  ]

特殊函数nameof是编译时特性,returns标识符的静态名称。因此,它不能在运行时使用,您的运行时代码将不包含对该函数的任何引用,结果始终是编译时常量。

因此,您不能将它与管道一起使用,也不能作为第一个 class 函数使用。当你尝试它时,你会得到给定的错误。

你写的代码大概是最简洁的了,因为你好像是想得到这些标识符的名字。没有语法方法可以动态地执行此操作(除了反射,但这是一种完全不同的方法)。

添加这个特殊 function/operator 的主要原因是为了帮助在代码中重命名操作,或者在 ArgumentNullException.

等异常中安全地使用参数名称

RFC 中有完整的详细信息,特别是“其他注意事项”部分,其中详细介绍了您的用例:https://github.com/fsharp/fslang-design/blob/master/preview/FS-1003-nameof-operator.md

在实现中,就不需要使用 Unchecked.defaultof 进行了长时间的讨论,但如果不对解析器进行重大重写,我们找不到这样做的好方法。请注意,该代码不会增加运行时开销,它已被删除。