gpt4 book ai didi

reflection - F# nameof 运算符不是一流的函数

转载 作者:行者123 更新时间:2023-12-03 21:12:21 24 4
gpt4 key购买 nike

我在我的项目文件中使用 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 的问题进行了长时间的讨论,但是如果不对解析器进行大量重写,我们找不到这样做的好方法。请注意,该代码不会增加运行时开销,而是已删除。

关于reflection - F# nameof 运算符不是一流的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63002244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com