Il tipo predefinito "System.ValueTuple´2" non è definito o importato


385

Ho installato Visual Studio 15 Preview 3 e ho provato a utilizzare la nuova funzionalità tupla

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

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

Quando compilo ottengo l'errore:

Il tipo predefinito "System.ValueTuple´2" non è definito o importato

Secondo il post del blog , questa funzionalità dovrebbe essere "attiva" per impostazione predefinita.

Cosa ho fatto di sbagliato?


3
Qualcuno sa se il pacchetto NuGet è richiesto anche nel 2017 RTM targeting 4.6.2? Sembra che tu ne abbia ancora bisogno e mi aspettavo che non l'avresti fatto nella versione finale.
dmeglio

puoi provare a usare System.Tuple <int, int> invece
Kevin Xiao

Per me questo stackoverflow.com/a/46533630/4383425 era la soluzione.
Andre

Risposte:


528

Per .NET 4.6.2 o versioni precedenti, .NET Core 1.xe .NET Standard 1.x è necessario installare il pacchetto NuGet System.ValueTuple:

Install-Package "System.ValueTuple"

O usando un riferimento al pacchetto in VS 2017:

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

.NET Framework 4.7, .NET Core 2.0 e .NET Standard 2.0 includono questi tipi.


3
Grazie. Significa che funzionerebbe con 4.6.2? Il debugger mostra ancora x.Item1 x.Item2. Invece di (xx e xy) Sai se questo cambierà?
gsharp,

2
Pacchetto di installazione "System.ValueTuple" -IncludePrerelease
Frison Alexander

14
Bene, non sembra essere in 4.6.2.
binki,

12
Funziona con 4.6.2, ma necessita comunque di questo pacchetto.
Elisabeth,

8
Con .NET 4.7, il pacchetto è incluso in modo nativo.
Mafii,

40

Fa parte del .NET Framework 4.7.

Finché non scegli come target il framework sopra o superiore (o .NET Core 2.0/ .NET Standard 2.0), dovrai fare riferimento ValueTuple. Fallo aggiungendo ilSystem.ValueTuple NuGet Package


1
Ho appena provato con .net 4.7 e non ha funzionato? System.ValueTuple`2non trovato
Bidou,

Ho installato .net Framework 4.7 e il pacchetto di destinazione per Visual Studio. Ho anche selezionato la versione 4.7 nel menu a discesa, ma non viene ancora compilata.
Bidou,

10
Ok ho appena trovato il problema: la dll System.ValueTuple è stata codificata nel mio file di progetto (csproj). La rimozione di questa voce dal file di progetto ha risolto il problema.
Bidou,

Buona soluzione, ma potresti aggiungere maggiori dettagli. Nel mio caso, System.ValueTuple.dll era ancora in giro nella mia cartella bin. Una volta cancellato, ero a posto. La mia versione linguistica è disponibile defaulte tutto funziona.
toddmo


5

Per Visual Studio Code usa il Terminale integrato ed esegui:

dotnet add package "System.ValueTuple"

Non dimenticare di correre dotnet restoredopo.


Non sono stato in grado di farlo funzionare in VS Code.
JonathanPel

10
Nota: non farlo con .Net 4.7
toddmo


3

Nel caso in cui altri abbiano lo stesso problema, ho riscontrato questo errore dopo aver aggiornato un progetto su 4.7. Stranamente, ho dovuto rimuovere il riferimento System.ValueTuple per far scomparire questo errore.


3

Non consiglierei di aggiungere ValueTuplecome riferimento al pacchetto i progetti .net Framework. Come sapete, questo assembly è disponibile da 4.7 .NET Framework.

Possono verificarsi alcune situazioni in cui il progetto proverà a includere a tutti i costi ValueTupledalla cartella .NET Framework anziché dalla cartella del pacchetto e può causare alcuni errori di assembly non trovati.

Oggi abbiamo avuto questo problema in compagnia. Avevamo una soluzione con 2 progetti (ho semplificato troppo):

  • Lib
  • Web

Libincludeva ValueTuple e Webstava usando Lib. Si è scoperto che per qualche motivo sconosciuto Webquando si cercava di risolvere il percorso si ValueTupletrovava HintPathnella directory di .NET Framework e si prendeva una versione errata. La nostra applicazione stava andando in crash a causa di ciò. ValueTupleNon è stata definita .csprojdi WebHintPathper tale assemblaggio. Il problema era molto strano. Normalmente copia l'assembly dalla cartella del pacchetto. Questa volta non era normale.

Per me è sempre un rischio aggiungere System.*riferimenti al pacchetto. Sono spesso come una bomba a orologeria. Stanno bene all'inizio e possono esplodere in faccia nel momento peggiore. La mia regola empirica: non utilizzare il System.*pacchetto Nuget per .NET Framework se non è realmente necessario.

Abbiamo risolto il nostro problema aggiungendo manualmente ValueTuplenel .csprojfile il Webprogetto.


1

Mi sono imbattuto anche in questo problema durante l'aggiornamento da .NET 4.6.2 a .NET 4.7.2. Sfortunatamente, non sono stato in grado di rimuovere il riferimento al pacchetto System.ValueTupleperché un altro pacchetto NuGet che utilizzo dipende da esso.

Finalmente sono stato in grado di individuare la causa principale: c'era una versione .NET 4.6.2 di mscorlib.dllaggirarsi nella cartella del progetto (output di un'operazione di pubblicazione) e MSBuild ha deciso di fare riferimento a questo assembly anziché al riferimento .NET 4.7.2 ufficiale gruppo situato in C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

A causa del fatto che System.ValueTuple è stato introdotto in .NET 4.7, MSBuild non è riuscito a compilare perché non è stato possibile trovare il tipo nell'assieme di riferimento di .NET 4.6.2.

(duplicato di https://stackoverflow.com/a/57777123/128709 )


0

Ho dovuto controllare il file System.ValueTuple.dll era sotto il controllo del codice sorgente e correggere il suo riferimento nei file .cssproj:

  1. fare clic con il tasto destro su ciascun progetto in soluzione
  2. scarica il progetto
  3. modifica file .cssproj: modifica

<Riferimento Include = "System.ValueTuple">

<HintPath>

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

</ HintPath>

</ Riferimento>

in

<Riferimento Include = "System.ValueTuple">

<HintPath>

.. \ pacchetti \ System.ValueTuple.4.4.0 \ lib \ netstandard1.0 \ System.ValueTuple.dll

</ HintPath>

</ Riferimento>

  1. salva le modifiche e ricarica i progetti
  2. trova System.ValueTuple.dll e salvalo in questa cartella
  3. aggiungere il riferimento di questo file nel controllo del codice sorgente

(Facoltativo): 7. risolvere gli stessi problemi con un altro file DLL in questo modo


1
La codifica effettiva di un percorso di file fisso (o di qualsiasi stringa) non è mai una buona soluzione.
Arghya C

0

Stavamo riscontrando lo stesso problema in uno dei nostri vecchi progetti rivolti al Framework 4.5.2. Ho provato diversi scenari, inclusi tutti quelli elencati sopra: target 4.6.1, aggiungere il pacchetto System.ValueTuple, eliminare le cartelle bin, obj e .vs. Niente da fare. Ripeti la stessa procedura per 4.7.2. Quindi ho provato a rimuovere il pacchetto System.ValueTuple dal momento che stavo prendendo di mira la 4.7.2 come suggerito da un commentatore. Ancora niente. Controllato il percorso di riferimento del file csproj. Sembra giusto È persino tornato alla versione 4.5.2 e installa nuovamente il pacchetto. Tutto questo con diversi VS si riavvia ed elimina più volte le stesse cartelle. Letteralmente niente ha funzionato.

Ho dovuto refactoring per utilizzare invece una struttura. Spero che altri non continuino a incontrare questo problema in futuro, ma ho pensato che ciò potesse essere utile se finissi per essere sconcertato come lo eravamo noi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.