如何在F#交互式环境中使用Span?

4

我尝试通过以下方式引用System.Memory

#r "C:/Program Files/dotnet/shared/Microsoft.NETCore.App/2.1.5/System.Memory.dll"

但是F#交互仍然显示The value or constructor 'Span' is not defined。当我尝试使用open System.Memory时,它会显示The namespace 'Memory' is not defined。有没有办法解决这个问题?


1
你确定这个 DLL 是针对正确的目标吗? - Fyodor Soikin
@FyodorSoikin 我不确定如何检查它。我唯一能提供的额外信息是,如果我在 .fs 文件中运行程序,它会运行。这让我想到我有正确的 dll,但不确定它的路径。 - ozgur
1个回答

3

你不需要打开 System.Memory,但是你需要打开 System。你可能还想先将 System.Memory nuget 包安装到 .NET framework 应用程序中,然后再引用它。不过我不确定 FSI 如何与 Span<T> 交互。

#if INTERACTIVE
#r @"C:\Users\username\Documents\Source\ConsoleApplication1\packages\System.Memory.4.5.1\lib\netstandard2.0\System.Memory.dll"
#r "System.Runtime.dll"
#endif


open System
open System.Runtime.CompilerServices

[<IsByRefLike; Struct>]
type S(count1: Span<int>, count2: Span<int>) =
    member x.Count1 = count1
    member x.Count2 = count2  

你可能需要先将 System.Memory nuget 到 .NET Framework 应用程序中,然后再引用它。我不明白这段话。我不能直接使用该程序集吗? - ozgur
@ozgur 我假设您的用例来自 FSI。 FSI 尚未使用 .netcore,因此您可能会遇到来自 netcoreapp 的 System.Memory dll 的问题,也可能不会遇到。首先尝试您的原始方法,但打开 System,然后使用 Span。如果这对您不起作用,请下载 System.Memory 并引用它。Netstandard 2.0 应该覆盖 .NET4.7.X 及以上版本。我经常在测试 FSI 中的 netcoreapp 时使用此技巧。但请注意,FSI 使用了很多反射(我想),并且可能无法反射 byref 类型。因此,总结一下,您确实需要 #r System.Memory.dll,但您需要打开 System。 - s952163

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接