3

宣布 F# 4.5 时,声明如下:

F# 功能集包括

  • [...]

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

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

4

3 回答 3

3

该属性位于System.Runtime.CompilerServices

open System.Runtime.CompilerServices

[<Struct; IsByRefLike>]
type Apa =
    { A: Span<int>
      B: int }

Phillip Carter在 F# 4.5 中的新增功能(大约 21 分钟)中谈到了这一点。

它适用于 .NET Core 和 .NET Framework,但不适用于 .NET Standard 2.0。

于 2018-12-27T05:24:50.760 回答
0

从 .NET SDK 6.0.200(在 Visual Studio 2022 17.1 中可用)开始,F# 编译器可以识别用户定义IsByRefLikeAttribute的 s。以下代码将透明地启用在 .NET Standard 2.0 以及更高版本的框架上定义 ref 结构:

#if NETSTANDARD2_0
namespace System.Runtime.CompilerServices

open System

[<Sealed; AttributeUsage(AttributeTargets.Struct)>]
type IsByrefLikeAttribute() = inherit Attribute()
#endif

namespace MyLibrary

open System
open System.Runtime.CompilerServices

[<IsByRefLike>]
type MyRefStruct(span: Span<int>) = struct end
于 2022-02-16T00:01:14.500 回答
-3

从技术上讲,这不是答案。

首先,根据规范,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. 如果您认为您需要,请您发布一个您实际需要它的示例。
于 2019-01-03T22:17:30.900 回答