Использование Span в Netstandard 2.1 без зависимостей - PullRequest
0 голосов
/ 31 марта 2020

Список документов C# span , которые распространяются на. NET Core 2.1+ и. NET Standard 2.1. В Announcing. NET Standard 2.1 , Span<T> указан как основной момент релиза. В сторонних статьях также перечислено добавление Span<T> in. NET Standard 2.1.

Я понял, что эти фрагменты доказательств означают, что можно использовать span таким же образом в целевой библиотеке netstandard2.1 как в целевой библиотеке netcoreapp2.1. Я пробовал это в моей библиотеке с нулевыми зависимостями, где, если кто-то нацелен на netcoreapp2.1, тогда становятся доступными API-интерфейсы библиотеки - например:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netcoreapp2.1;netstandard2.1</TargetFrameworks>
  </PropertyGroup>

  <!-- snip -->

  <PropertyGroup Condition="'$(TargetFramework)'=='netcoreapp2.1' Or '$(TargetFramework)'=='netstandard2.1'">
    <LangVersion>7.2</LangVersion>
  </PropertyGroup>
</Project>

(netstandard2.0, используемый в сниппете, пример цели, где библиотека не предоставляет Span совместимых API, поскольку это потребует зависимости System.Memory)

Но это не так (ошибки с типом или пространством имен Span <> «невозможно найти» при таргетинге на netstandard2.1)

Цель этой библиотеки - иметь нулевые зависимости, поэтому я бы предпочел не зависеть от System.Memory.

Можно ли использовать Span в библиотеке Netstandard 2.1 без зависимостей таким же образом, как можно использовать Span в netcoreapp2.1 без зависимостей?

РЕДАКТИРОВАТЬ: Ответ "да, можно использовать Span<T> в netstandard 2.1 без зависимостей ". У меня была ошибка на моем конце, где у меня была

#if NETCOREAPP2_1
using System;
#endif

вместо

#if (NETCOREAPP2_1 || NETSTANDARD2_1)
using System;
#endif

Глупая ошибка. Вид wi sh Я мог бы удалить этот вопрос сейчас: D

1 Ответ

1 голос
/ 31 марта 2020

Вам нужна System.Memory:

<PackageReference Include="System.Memory" Version="4.5.4" />

Вы можете сделать эту зависимость условной , например, чтобы добавить ее только в netstandard2.0:

<PackageReference Include="System.Memory" Version="4.5.4"
    Condition="'$(TargetFramework)'=='netstandard2.0'"/>

это означает, что вы можете иметь зависимость только тогда, когда она действительно необходима , но: на TFM, которые не имеют ее по своей природе, вам понадобится зависимость.

...