F#4.5 已发布,F#4.5 最大的亮点是实现了与 .NET Core 2.1 中一致的 Span<'T> 及其相关功能,现在可在 F# 中通过 Span
、Memory
和 ref
之类的构造来有效使用和生成 API。F#的上一个版本是 4.1 ,这次直接跳到 4.5 是为了版本对齐:
可通过两种方式下载:
更新亮点
Span<'T> 支持
功能包括:
新的
voidptr
类型。FSharp.Core 中新的
NativePtr.ofVoidPtr
和NativePtr.toVoidPtr
函数。新的类型
inref<'T>
和outref<'T>
,分别是只读的 byref 和只写的 byref。 此值对应于 C# 中的in ref
和out ref
。能够生成
ByRefLike
结构(如Span
和ReadOnlySpan
)。能够生成
IsReadOnly
结构。隐式取消引用方法中的
byref
返回值和inref
返回值。能够在
byref
/inref
/outref
上生成扩展成员。全面的安全检查,以防止代码不健全。
此功能集的主要目标是:
提供与 F#互操作并生成高性能代码的方法。
与 .NET Core 性能创新保持完全一致。
更好的代码生成,尤其是类似于 byref 的构造。
此功能集修复了 F# 4.1 中 byref
返回值初始设计的一个 bug - 即返回 byref
的函数、方法和属性未隐式取消引用返回值。使该功能与 C# 处理 ref
返回值的方式保持一致。 当类型批注指示现在使用 ref
返回值的隐式取消引用时,将用到错误消息。
此外,此功能集还修复了 F# 编译器中的一个 bug - 即可以进行“不良结构替换”,也就是说,调用 F# 结构上的方法时可以使用其他结构替换正调用的实际结构。 现将结构上的 this
参数视为 inref<MyStruct>
,其中包含一条错误:如果你希望修改该结构则该错误建议添加可变字段。
可在此功能集的 RFC 中详细了解 span
和 ref
之类的构造。
计算表达式中的 Match!
F# 4.5 引入了 match!
,一个用在计算表达式中的新关键字(由 John Wostenberg 独立提供)。 此语法糖等同于在结果中 let!
后跟 match
。 可在 match!
的 RFC 中了解详细信息。
放宽了使用 yield
时序列、列表和数组表达式中的向上转换要求
F# 4.5 现在放宽了某些限制:使用 yield
时需要向上转换来将子类型转换为超类型。 自 F# 3.1 起如果不使用 yield
这些表达式中已无此限制,因此此项改进使得与现有行为更加一致。 可在此功能的 RFC 中了解详细信息。
列表和数组括号上允许缩进
F# 4.5 现在放松了列表和数组括号的缩进规则,此前如果列表和数组括号位于自己的行上需将其向前缩进一个作用域。 这项要求一直以来都非常令人困惑,尤其是对 F# 初学者。 此外,F# 序列表达式无此要求。 现在,数组表达和列表表达式与序列表达式一样,不再受此要求限制。 可在此功能的 RFC 中了解详细信息。
枚举用例以公共形式发出
现在 F# 4.5 在所有情况下以公共形式发出枚举用例,以与 C# 发出枚举用例的方式保持一致。 这也更便于分析工具分析来自 F# 代码的日志,其中发出的是值而不是标签名称。 可在此功能的 RFC 中了解详细信息。
F# 编译器改进
F# 4.5 中不仅包括之前提到的语言功能改进,也包括对 F# 编译器的改进。 这些方法包括:
删除了 F# 编译器中高达 2.2% 的分配(各种情况下),改进了编译器性能。
修复了对基于结构的可枚举对象使用
yield!
时AccessViolatioNException
中产生的 bug。现可再次从
FSharpFunc
中继承。对于 F# for .NET Core 的调试版本默认禁用尾调用。 它们在发布版本中启用,因此与桌面版 F# 编译器匹配。
修复了 F# 引用规范化,允许你控制写入输出文件的可传递程序集引用。 你便可执行 .NET Core 上程序集重定向的等效操作。
修复了以下 bug:忽略了尝试在内联函数上使用动态调用时用到的错误消息。 错误消息现将传送。
F# 现在尊重你可在项目文件中设置的
WarningsNotAsErrors
标志。Isaac Abraham 更新了模式匹配分支不返回相同类型时出现的错误消息,使其更加友好。
Steffen Forkmann 修复了编译缺少重载方法实现的接口实现时出现内部错误这一 bug。
Gauthier Segay 删除了编译器文法阶段中一些没必要的数组复制。
F# 枚举上不完整的模式匹配现在生成详细的警告,给出未涵盖的用例示例(由 John Wostenberg 提供)。
`#nowarn "2003" 现在受到尊重(由 Matthias Diitrich 提供)。
Steffen Forkmann 修复了在 F# 重载解析中使用 C# 扩展方法可能失败这一 bug。
Steffen Forkmann 修复了内部 QueueList 数据结构 bug。
Steffen Forkmann、Eugene Auduchinok 和 ncave 还提供了各种小的优化并进行了代码清除工作。
F# Core 4.5.x
现在推出了对 F# 核心库的下列补充内容:
完成了大量工作来改进
async { }
计算表达式的堆栈跟踪。 现在应能够在堆栈跟踪中查看用户代码和用户行号。 可在此功能的 RFC 中了解详细信息。提供类型
System.Func
和System.Action
重载的FuncConvert.FromFunc
和FuncConvert.FromAction
API,帮助 C# 中的互操作。 可在此功能的 RFC 中了解详细信息。提供了新类型
ValueOption
,它是旨在为活动模式带来更好性能的系列未来功能中的首个功能。 可在此功能的 RFC 中了解详细信息。TryGetValue
现在是 F# Map 类型上的新成员。 可在此功能的 RFC 中了解详细信息。解决了首次调用
MailboxProcessor.TryReceive
时 CPU 使用率较高的问题。bool
比较现在使用快速泛型比较(由 Vasily Kirichenko 提供)。Array.allPairs
的摘要文本已更新为正确(由 Patrick McDonald 提供)
F# 工具改进
此版本中提供 F# 工具的重大改进,例如性能改进和一些新的编辑器功能。 与往常一样,F# 开源社区提供了大量内容,作出了巨大贡献。 以下是一些亮点:
改进了所有形式的 .NET SDK 样式项目的 IntelliSense 性能,包括那些使用多目标的项目。
Vasily KirichenkoSteffen Forkmann 和 Gauthier Segay 进行了社区驱动的工作,分析和改进了非常大的文件的 IntelliSense 性能。 非常大的文件(10k 以上的代码行)中的 IntelliSense 现在约是原来的两倍快。
过时 FSharp.Core(尽管安装了包)的警告不再出现在 .NET SDK 样式项目中。
IntelliSense 中
.
之后为成员显示 XML 文档的说明工具提示在 10 秒后不再超时。修复了无法在对象构造函数参数中设置断点这一 bug。
修复了重命名符号属于泛型参数时将进行复制这一 bug。
.NET Framework 的模板(经典 F# 模板)现在使用来自 NuGet 包的 FSharp.Core,以便与 .NET SDK F# 模板保持一致。
现在为
()
、[]
、{}
、[||]
和[<>]
大括号对提供自动的事务型大括号完成。现在,可以通过按住 Ctrl 并单击 F# 符号来转到定义。 此笔势的设置在“工具”>“选项”窗口中也受到尊重。
修改了 IntelliSense 性能 UI,允许为各种 IDE 功能配置过时的 typecheck 信息。 每个选项的说明现在显示在设置的工具提示中。
大括号匹配突出显示现在正确地突出显示大括号。
现在当类型以递归方式定义时“转到定义”正确导航。
Vasily Kirichenko 修复了文件顶部为空时未将自动导入命名空间打开这一 bug。
Vasily Kirichenko 修复了将包含点的
printf
说明符错误地着色这一 bug。Vasily Kirichenko 修复了将递归模块内所有打开项视为未使用这一 bug。
Vasily Kirichenko 大大提升了 Unused Opens 分析器的性能。
属性自动完成功能现在仅建议确实是属性的选项。
现在为构造函数调用站点上的类型提供程序静态参数生成签名帮助工具提示。
Vasily Kirichenko 修复了将用作度量单位的值类型作为引用类型进行着色这一 bug。
Vasily Kirichenko 修复了滚动时一些文件的语义着色可能消失这一 bug。
现在提供了试验性的 CodeLens 实现。 可在“选项”>“文本编辑器”>“F#”>“代码透镜”中将其打开。
Sebastian Urban 修复了 F# 编译器服务会错误地省略 XML 文档中模块名称的拼写这一 bug。
使用
Dictionary
与ContainsKey
和后续Item
调用的代码已更改为使用TryGetValue
。Jakob Majoka 也参与了使用工具提示的其他 API 这一过程的创作。
更多详情可查阅发行说明: