Предопределенный тип 'System.ValueTuple´2´ не определен или не импортирован


385

Я установил Visual Studio 15 Preview 3 и попытался использовать новую функцию кортежа

static void Main(string[] args)
{
    var x = DoSomething();
    Console.WriteLine(x.x);
}

static (int x, int y) DoSomething()
{
    return (1, 2);
}

Когда я компилирую, я получаю ошибку:

Предопределенный тип 'System.ValueTuple´2´ не определен или не импортирован

Согласно сообщению в блоге , эта функция должна быть включена по умолчанию.

Что я сделал не так?


3
Кто-нибудь знает, требуется ли пакет NuGet даже в 2017 RTM с таргетингом на 4.6.2? Кажется, вам все еще нужно это, и я ожидал, что вы не будете в финальной версии.
Время

вместо этого вы можете попробовать использовать System.Tuple <int, int>
Кевин Сяо

Для меня этот stackoverflow.com/a/46533630/4383425 был решением.
Андре

Ответы:


528

Для .NET 4.6.2 или ниже, .NET Core 1.x и .NET Standard 1.x вам необходимо установить пакет NuGet System.ValueTuple:

Install-Package "System.ValueTuple"

Или используя ссылку на пакет в VS 2017:

<PackageReference Include="System.ValueTuple" Version="4.4.0" />

.NET Framework 4.7, .NET Core 2.0 и .NET Standard 2.0 включают эти типы.


3
Спасибо. Означает ли это, что он будет работать с 4.6.2? Отладчик по-прежнему показывает x.Item1 x.Item2. Вместо (хх и ху) Знаете ли вы, что это изменится?
gsharp

2
Инсталляционный пакет "System.ValueTuple" -Включить пререлиз
Александр,

14
Ну, это не похоже на 4.6.2.
Бинки

12
Работает с 4.6.2, но этот пакет все еще нужен.
Элизабет

8
В .NET 4.7 пакет изначально включен.
Мафия

40

Это часть .NET Framework 4.7.

Пока вы не нацелены на вышеуказанную структуру или выше (или .NET Core 2.0/ .NET Standard 2.0), вам нужно будет ссылаться ValueTuple. Сделайте это, добавивSystem.ValueTuple NuGet Package


1
Я только что попробовал с .net 4.7, и это не сработало? System.ValueTuple`2не найден
Bidou

Я установил .net Framework 4.7 и целевой пакет для Visual Studio. Я также выбрал версию 4.7 в раскрывающемся списке, но она по-прежнему не компилируется.
Bidou

10
Хорошо, я только что нашел проблему: dll System.ValueTuple был жестко запрограммирован в моем файле проекта (csproj). Удаление этой записи из файла проекта решило проблему.
Bidou

Хорошее решение, но вы можете добавить больше деталей. В моем случае, System.ValueTuple.dll все еще зависал в моей папке bin. Как только я удалил это, мне было хорошо идти. Моя языковая версия на defaultи все работает.
Toddmo

13

Типы ValueTuple встроены в новые платформы:

  • .NET Framework 4.7
  • .NET Core 2.0
  • Mono 5.0
  • .Net Стандарт 2.0

Пока вы не нацелены на одну из этих более новых версий фреймворка, вам нужно ссылаться на пакет ValueTuple.

Более подробная информация на http://blog.monstuff.com/archives/2017/03/valuetuple-availability.html


5

Для кода Visual Studio используйте встроенный терминал и запустите:

dotnet add package "System.ValueTuple"

Не забудьте бежать dotnet restoreпотом.


Я не смог заставить это работать в VS Code.
ДжонатанПил

10
Примечание: не делайте этого с .Net 4.7
toddmo

3

Убедитесь, что у вас установлен .NET 4.6.2 Developer Pack для VS, а затем извлеките System.ValueTupleпакет из NuGet.


2
Даже с .NET 4.6.2, похоже, все еще нужен пакет System.ValueTuple.
HaveSpacesuit

3
@mrsundquist, да что-нибудь ниже 4.7
toddmo

3

В случае, если у других есть такая же проблема, я столкнулся с этой ошибкой после обновления проекта до 4.7. Как ни странно, мне пришлось удалить ссылку System.ValueTuple, чтобы эта ошибка исчезла.


3

Я бы не советовал добавлять ValueTupleв качестве ссылки на пакет проекты .net Framework. Как вы знаете, эта сборка доступна в 4.7 .NET Framework.

Могут быть определенные ситуации, когда ваш проект будет пытаться включить любой ценой ValueTupleиз папки .NET Framework вместо папки пакета, и это может вызвать некоторые ошибки сборки не найдены.

У нас была эта проблема сегодня в компании. У нас было решение с 2 проектами (я упрощаю это):

  • Lib
  • Web

Libбыл в том числе ValueTuple и Webиспользовал Lib. Оказалось, что по неизвестным причинам Webпри попытке пути постановляем ValueTupleимел HintPathв папку .NET Framework и принимает неправильную версию. Наше приложение зависало из-за этого. ValueTupleне был определен .csprojиз Webни HintPathдля этой сборки. Проблема была очень странной. Обычно это скопировало бы сборку из папки пакета. Это время не было нормальным.

Для меня всегда есть риск добавить System.*ссылки на пакеты. Они часто похожи на бомбу замедленного действия. С ними все хорошо с самого начала, и они могут взорваться тебе в худший момент. Мое практическое правило: не используйте System.*пакет Nuget для .NET Framework, если в этом нет реальной необходимости.

Мы решили нашу проблему, добавив вручную ValueTupleв .csprojфайл внутри Webпроекта.


1

Я также столкнулся с этой проблемой при обновлении с .NET 4.6.2 до .NET 4.7.2. К сожалению, я не смог удалить ссылку на пакет, System.ValueTupleпотому что от него зависит другой пакет NuGet, который я использую.

Наконец, я смог найти основную причину: mscorlib.dllв папке проекта была версия .NET 4.6.2 (вывод операции публикации), и MSBuild решила сослаться на эту сборку вместо официальной ссылки .NET 4.7.2 сборка находится в C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

В связи с тем, что System.ValueTuple был представлен в .NET 4.7, MSBuild не удалось выполнить компиляцию, поскольку он не смог найти тип в справочной сборке .NET 4.6.2.

(копия https://stackoverflow.com/a/57777123/128709 )


0

Я должен был проверить, что файл System.ValueTuple.dll находится под контролем исходного кода и исправить его ссылку в файлах .cssproj:

  1. щелкните правой кнопкой мыши каждый проект в решении
  2. выгрузить проект
  3. редактировать файл .cssproj: изменить

<Reference Include = "System.ValueTuple">

<HintPath>

.... \ ProjectName \ ProjectName \ OBJ \ Release \ Пакет \ PackageTmp \ Bin \ System.ValueTuple.dll

</ HintPath>

</ Reference>

в

<Reference Include = "System.ValueTuple">

<HintPath>

.. \ пакеты \ System.ValueTuple.4.4.0 \ Lib \ netstandard1.0 \ System.ValueTuple.dll

</ HintPath>

</ Reference>

  1. сохранить изменения и перезагрузить проекты
  2. найдите System.ValueTuple.dll и сохраните его в этой папке
  3. добавить ссылку на этот файл в систему контроля версий

(Необязательно): 7. Решите те же проблемы с другими файлами .dll таким образом


1
Жесткое кодирование фиксированного пути файла (или любой строки) никогда не является хорошим решением.
Arghya C

0

Мы видели эту же проблему в одном из наших старых проектов, нацеленных на Framework 4.5.2. Я пробовал несколько сценариев, включая все перечисленные выше: цель 4.6.1, добавить пакет System.ValueTuple, удалить папки bin, obj и .vs. Нет кости. Повторите тот же процесс для 4.7.2. Затем попытался удалить пакет System.ValueTuple, так как я ориентировался на 4.7.2, как предложил один комментатор. Еще ничего. Проверен путь к файлу csproj. Выглядит правильно. Даже опустился до 4.5.2 и снова установил пакет. Все это с несколькими VS перезагружается и удаляет одни и те же папки несколько раз. Буквально ничего не получалось.

Мне пришлось рефакторинг, чтобы использовать структуру вместо. Я надеюсь, что другие не будут продолжать сталкиваться с этой проблемой в будущем, но думали, что это может быть полезно, если вы окажетесь в такой же тупости, как и мы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.