【问题标题】:How to use Span in F# interactive?如何在 F# 交互中使用 Span?
【发布时间】:2018-10-30 17:47:14
【问题描述】:

我尝试通过

添加对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。当我尝试使用打开System.Memory 时,它会显示The namespace 'Memory' is not defined。有没有办法做到这一点?

【问题讨论】:

  • 您确定 DLL 用于正确的目标吗?
  • @FyodorSoikin 我不确定如何检查它。我可以提供的唯一额外信息是,如果我在 .fs 文件中运行程序,它就会运行。这让我觉得我有正确的 dll,但不确定它的路径。

标签: f# .net-core f#-interactive f#-scripting


【解决方案1】:

您不需要open System.Memory,但您确实需要open System。您可能还想先将 System.Memory nuget 到 .NET 框架应用程序中,然后再引用它。我想知道 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 框架应用程序中,然后再引用它我不明白这个标准。我不能直接使用那个程序集吗?
  • @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.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2017-07-14
  • 1970-01-01
相关资源
最近更新 更多