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

Я установил 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' не определен или не импортирован

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

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

Ответ 1

Для .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 включают эти типы.

Ответ 2

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

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

Ответ 3

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

  • .NET Framework 4.7
  • .NET Core 2.0
  • Моно 5.0
  • .Net Standard 2.0

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

Подробнее на http://blog.monstuff.com/archives/2017/03/valuetuple-availability.html

Ответ 4

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

dotnet add package "System.ValueTuple"

Не забудьте запустить dotnet restore после.

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

  • Lib
  • Web

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

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

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

Ответ 8

Я должен был проверить, что файл 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 таким образом

Ответ 9

Мы видели эту же проблему в одном из наших старых проектов, нацеленных на 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 перезагружается и удаляет одни и те же папки несколько раз. Буквально ничего не сработало.

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

Ответ 10

Я также столкнулся с этой проблемой при обновлении с .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.

(дубликат fooobar.com/info/97993/...)