Предопределенный тип '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
включал 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:
- щелкните правой кнопкой мыши каждый проект в решении
- выгрузить проект
- редактировать файл .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>
- сохранить изменения и перезагрузить проекты
- найдите System.ValueTuple.dll и сохраните его в этой папке
- добавить ссылку на этот файл в систему контроля версий
(Необязательно): 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/...)