在F# 4.5 was announced时指出:
F#功能集由
组成
[...]
产生IsByRefLike结构的能力(此类结构的示例:Span <'T>和ReadOnlySpan <'T>)。
如何“产生”这些类型?我尝试使用[<IsByRefLike>]
属性,但在.NET Standard 2.0中找不到该属性。
答案 0 :(得分:3)
可以在System.Runtime.CompilerServices
open System.Runtime.CompilerServices
[<Struct; IsByRefLike>]
type Apa =
{ A: Span<int>
B: int }
Phillip Carter在What's new in F# 4.5(大约21分钟)中谈到了这一点。
它可用于.NET Core和.NET Framework,但不适用于.NET Standard 2.0。
答案 1 :(得分:-1)
从技术上讲,这不是答案。
首先,根据规范,IsByRefLike
供编译器使用,而不供开发人员使用:https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.isbyreflikeattribute?view=netframework-4.7.2
第二,当我们确实要从编译器中获取内容时,至关重要的是,我们必须了解要从编译器中获取的内容。所以一个正确的问题可能是:我需要ABC因为我需要做XYZ ,其中ABC
是与IsByRefLike
相关的事物,然后XYZ
是某些事物基于IsByRefLike
。该问题并未说明为什么需要IsByRefLike
。
我认为在考虑使用/不使用哪种语言功能时,应该始终采用极简主义方法:我们是否真的需要某种特定的语言功能来完成所需的工作? F#Option.bind
浮现在脑海:如果函数是单行代码,则Option.bind
很棒。但是,如果存在一些如何解析结果的树,则最好不使用Option.bind
来显式地执行该操作。
所以问题是:
IsByRefLike
吗?