我在项目文件中使用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
是一个编译时特性,它返回标识符的静态名称。因此,它不能在运行时使用,运行时代码将不包含对该函数的任何引用,结果始终是编译时常数。
因此,您不能将其与管道一起使用,也不能将其用作一级函数。当你尝试它时,你会得到给定的错误。
您编写的代码是最简洁的,因为您似乎想要获得这些标识符的名称。没有语法方法可以动态地做到这一点(除了反射,但这是一种完全不同的方法(。
添加此特殊函数/运算符的主要原因是为了帮助在代码中进行重命名操作,或者在ArgumentNullException
等异常中安全地使用参数的名称。
全部细节在RFC中;其他考虑";,详细介绍了您的用例:https://github.com/fsharp/fslang-design/blob/master/preview/FS-1003-nameof-operator.md
在实现中,我们就不需要使用Unchecked.defaultof
进行了长时间的讨论,但如果不对解析器进行重大重写,我们就找不到一个好的方法来做到这一点。请注意,该代码不会增加运行时开销,而是被擦除了。