Заздалегідь визначений тип "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? Здається, вам це все одно потрібно, і я очікував, що ви не будете в остаточній версії.
dmeglio

ви можете спробувати використовувати 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. Замість (xx та xy) Чи знаєте ви, чи зміниться це?
gsharp

2
Install-Package "System.ValueTuple" -IncludePrerelease
Frison Alexander

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 у спадному меню, але вона все ще не компілюється.
Біду

10
Добре, я просто знайшов проблему: dll System.ValueTuple був жорстко закодований у моєму файлі проекту (csproj). Видалення цього запису з файлу проекту вирішило проблему.
Біду

Гарне рішення, але ви можете додати більше деталей. У моєму випадку System.ValueTuple.dll все ще був у моїй папці. Як тільки я це видалив, мені було добре піти. Моя версія працює defaultі все працює.
Тоддмо


5

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

dotnet add package "System.ValueTuple"

Не забудьте бігати dotnet restoreзгодом.


Мені не вдалося змусити це працювати в Кодексі VS.
JonathanPeel

10
Примітка: Не робіть цього з .Net 4.7
tddmo


3

У випадку, якщо інші мають таку ж проблему, я зіткнувся з цією помилкою після оновлення проекту до 4.7. Як не дивно, мені довелося видалити посилання System.ValueTuple, щоб ця помилка пішла.


3

Я б не радив додавати ValueTupleяк пакетну посилання на проекти .net Framework. Як відомо, ця збірка доступна з 4.7 .NET Framework.

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

У нас сьогодні ця проблема була в компанії. У нас було рішення з двома проектами (я спрощую це):

  • 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 файл: змінити

<Довідка включає = "System.ValueTuple">

<Підказка>

.... \ ProjectName \ ProjectName \ obj \ Release \ Package \ PackageTmp \ bin \ System.ValueTuple.dll

</ HintPath>

</ Довідка>

в

<Довідка включає = "System.ValueTuple">

<Підказка>

.. \ пакети \ System.ValueTuple.4.4.0 \ lib \ netstandard1.0 \ System.ValueTuple.dll

</ HintPath>

</ Довідка>

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

(Необов’язково): 7. таким чином вирішуйте ті самі проблеми з іншими файлами .dll


1
Жорстке кодування фіксованого шляху до файлу (або будь-якого рядка) ніколи не є хорошим рішенням.
Арг’я С

0

Ми спостерігали цю саму проблему в одному з наших старих проектів, націлених на Рамку 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.