如何在.NET Standard 2.0中的F#中定义引用结构?

时间:2018-12-26 20:05:18

标签: f# ref-struct

F# 4.5 was announced时指出:

  

F#功能集由

组成      
      
  • [...]

  •   
  • 产生IsByRefLike结构的能力(此类结构的示例:Span <'T>和ReadOnlySpan <'T>)。

  •   

如何“产生”这些类型?我尝试使用[<IsByRefLike>]属性,但在.NET Standard 2.0中找不到该属性。

2 个答案:

答案 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来显式地执行该操作。

所以问题是:

  1. 您真的需要IsByRefLike吗?
  2. 如果您认为自己愿意,可以请举一个您实际需要需要的地方的例子。