我应该在哪里找到新的 Span<T>?

23

现在很多人都在谈论新型的 Span<T> 是多么的强大,因此我迫不及待地想要重写我的一些库中的方法,但我到底在哪里可以找到它呢?我已将 Visual Studio 2017 更新至最新版本 15.5.0,其中变更日志显示:

C# 编译器现在支持 7.2 版本的语言特性,包括:

  • 通过 ref struct 修饰符,在 Kestrel 和 CoreFX 中使用 Span<T> 类型。

但是当我尝试在我的代码中使用它时,却出现了错误,并且智能感知无法解析它。我的项目使用 .net 4.6.2,并且语言版本设置为 latest minor

我需要安装一些 NuGet 包来使用它吗?我搞不清楚这个问题。


6
确实有些令人困惑。这篇文章https://msdn.microsoft.com/en-us/magazine/mt814808.aspx 描述了 Span 就好像它是框架的一部分一样:System.Span<T> is a new value type at the heart of .NET.,但只在最后的“What's Next”部分提到需要安装“System.Memory”NuGet 包。 - user276648
现在包已经发布了,你至少可以很容易地在主要的NuGet feed中找到它。当我提出这个问题时,它只能在一些奇怪和另类的Core-fx feed中找到,这不太容易弄清楚 :-| - t3chb0t
2个回答

21

您需要安装预发布版本 (在nuget管理器中勾选“包括预发布”复选框)的System.Memory软件包。 然后只需使用Span(它位于System命名空间中)。


8
为什么发布一个支持还在测试阶段的功能的编译器?难怪这一切都很令人困惑 :-| 实际上这意味着_嘿!我们的编译器现在支持一个新类型Span<T>,但你不能使用它,因为我们实际上还没有发布它_。 - t3chb0t
@t3chb0t,这与编译器并不直接相关。该软件包已经编译完成,因此与您的计算机上的编译器版本无关。但是,新版本的编译器提供了对此类用例有用的功能(当然,即使没有这种类型的功能,这些功能也很有用)。 - Evk
好的,但我不明白为什么变更日志中提到了编译器?如果这个新功能可以在没有专用编译器的情况下使用,那么为什么要费心呢?他们不能只发布包吗?每个人都会很高兴看到“这里是带有新的Span<T>的包” :-( 我以为它会随着这次更新一起推出,但显然没有。 - t3chb0t
1
@t3chb0t 在你的问题中提到的引用说:“通过 ref struct 修饰符支持 Span<T> 类型在 Kestrel 和 CoreFX 中的使用”- 加粗的内容是 C# 7.2 编译器特性,而不是 Span 类本身。至于为什么这个包仍然处于 beta 版本 - 我也不知道。 - Evk
1
这真是让人困惑不已。而且关于这些新的ref locals / ref returns / Span特性的文档也非常简略。 - JBeurer

8

Visual Studio 2019:如果你正在使用完整的.NET Framework(例如4.7.2):

  1. 进入NuGet包管理器
  2. 搜索Microsoft的System.Memory包并安装它。

现在你就可以使用Span<T>了。

不再需要搜索预发布版本了。


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