我在哪里可以找到新的 Span<T>?

Posted

技术标签:

【中文标题】我在哪里可以找到新的 Span<T>?【英文标题】:Where do I find the new Span<T>? 【发布时间】:2018-05-18 21:54:59 【问题描述】:

每个人都在写新类型 Span&lt;T&gt; 有多棒,所以我急切地想开始在我的库中重写几个方法,但是我在哪里可以找到它呢?我已将 Visual Studio 2017 更新到最新版本 15.5.0,其中更改日志显示:

C# 编译器现在支持 7.2 语言功能集,包括:

通过 ref struct 修饰符支持在整个 Kestrel 和 CoreFX 中使用的 Span&lt;T&gt; 类型。

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

我是否需要安装一些 NuGet 包才能使用它?我想不通。

【问题讨论】:

确实令人困惑。这篇文章msdn.microsoft.com/en-us/magazine/mt814808.aspx 将 Span 描述为框架的一部分:System.Span&lt;T&gt; is a new value type at the heart of .NET.,只是在最后的What's Next 部分提到需要安装System.Memory NuGet 包。 @user276648 现在包已经发布了,你至少可以很容易地在主要的 nuget-feed 中找到它。在我问这个问题的时候,它只能在 core-fx 的一些奇怪的替代提要中找到,要弄清楚这个问题并不容易:-| 【参考方案1】:

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

【讨论】:

他们为什么要发布一个支持某些仍处于测试阶段的编译器?难怪这如此令人困惑:-|所以这实际上意味着嘿!,我们的编译器现在支持一个新类型Span&lt;T&gt;,但你不能使用它,因为我们还没有真正发布它 @t3chb0t 它与编译器并不完全相关。该包已经编译,因此与您机器上的编译器版本无关。但是新版本的编译器提供了对这种类型的用例有用的功能(但即使没有这种类型的课程,这些功能也很有用)。 好的,但是我不明白为什么更改日志提到了编译器?如果这个新特性可以在没有专门的编译器的情况下使用,为什么还要麻烦呢?他们不能只发布包吗?每个人都会很乐意阅读这是带有新 Span&lt;T&gt; 的软件包 :-( 我以为它会与此更新一起出现,但显然它没有。 @t3chb0t 引用您在问题中提到的“通过 ref struct 修饰符支持在整个 Kestrel 和 CoreFX 中使用的 Span 类型” - 粗体是 C# 7.2 编译器特性,而不是 Span 类本身。至于为什么这个包仍然处于测试阶段 - 好吧,我不知道。 这真是令人困惑。这些新的 ref locals / ref return / Span 特性的文档也非常简单。【参考方案2】:

Visual Studio 2019:如果您使用的是完整的 .NET Framework(例如 4.7.2):

    转到 NuGet 包管理器 搜索 Microsoft 的 System.Memory 包并安装。

现在您可以使用Span&lt;T&gt;

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

【讨论】:

以上是关于我在哪里可以找到新的 Span<T>?的主要内容,如果未能解决你的问题,请参考以下文章

我在哪里可以找到一些关于 google adwords 的例子?

将 ref T 值固定为 void* 的 IL 方法(从并行代码处理 Span<T>)

可以在 ref 结构中初始化 Span<T> 字段吗?

如何表示 Span<T> 列表/数组

我在哪里可以找到模式的数据目标

C# 7.2 中的 Span<T> 和 Memory<T> 有啥区别?