Предопределенный тип '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´ не определен или не импортирован

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

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

9 ответов

Решение

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

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

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

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

  • .NET Framework 4.7
  • .NET Core 2.0
  • Mono 5.0
  • .Net Standard 2.0

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

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

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

dotnet add package "System.ValueTuple"

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

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

Наконец, я смог определить основную причину: была версия.NET 4.6.2. mscorlib.dll валяется в папке проекта (результат операции публикации), и 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.

(дубликат /questions/38259002/nevozmozhno-vernut-tuple-iz-metoda-ispolzuyuschego-visual-studio-2017-i-c-70/55054571#55054571)

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

Я бы не советовал добавлять 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 проект.

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

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

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

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

в

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

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

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

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

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

Если вы получили от кого-то код проекта, возможно, вы увидите это сообщение об ошибке. Я решаю эту проблему с установкой System.ValueTuple v4.3.0 после удаления System.ValueTuple v4.4.0

Если вы обновляете проект с.Net 4.6.x до.Net 7.x, вам нужно удалить ссылку на System.ValueTuple, иначе вы получите ошибку.

Другие вопросы по тегам