Impossibile restituire la tupla da un metodo usando Visual Studio 2017 e C # 7.0


98

Ho installato Visual Studio 2017 Community che è stato rilasciato una settimana fa e ho iniziato a esplorare le nuove funzionalità di C # 7.

Quindi ho creato un metodo semplice che restituisce due valori:

public class Program
{
    public static void Main(string[] args)
    {
        (int sum, int count) a = ReturnTwoValues();
    }

    static (int sum, int count) ReturnTwoValues() => (1, 1);
}

Il compilatore sta generando un errore:

Errore CS8137 Impossibile definire una classe o un membro che utilizza le tuple perché non è possibile trovare il tipo richiesto dal compilatore "System.Runtime.CompilerServices.TupleElementNamesAttribute". Ti manca un riferimento?

Ho provato a trovare un riferimento nel framework con questo nome, ma senza fortuna!

Se abbiamo bisogno di materiale aggiuntivo per utilizzare le funzionalità di C # 7.0, è molto strano che sia necessario farlo per ogni progetto?!


Risposte:


129

Ho appena esaminato questa pagina su Roslyn che descrive i seguenti passaggi per farlo funzionare:

  1. Avvia un progetto C #
  2. Aggiungere un riferimento al System.ValueTuple pacchetto da NuGet (pre-rilascio)

inserisci qui la descrizione dell'immagine

Seguendo questi passaggi, ora funziona. Ma è davvero molto strano che abbiamo bisogno di farlo per ogni singolo progetto che iniziamo! Spero che questo venga risolto quando raggiungiamo il rilascio ufficiale!


2
Una cosa che dovrebbe essere presente nella prossima versione è una correzione del codice che consente di aggiungere facilmente il pacchetto.
svick

6
Questa soluzione mi ha aiutato; anche con la versione completa di VS2017 Professional, scaricata a marzo 2017!
Nij

2
Molto seccato che questo non sia nella lingua ufficiale. Ho riscontrato lo stesso problema con questa soluzione. Lo stanno commercializzando come funzionalità del linguaggio C # 7 quando in realtà è più una funzionalità di estensione C # 7. Immagino che le cose possano diventare pelose in questo modo quando usi il nuovo compilatore Roslyn (di cui sono un fan) ... in ogni caso, questo è un triste effetto collaterale IMO.
Michael Puckett II

10
@MichaelPuckettII Penso che ciò sia dovuto al fatto che questa funzionalità richiede che le classi esistano nel framework .NET e non ne hanno ancora rilasciata una nuova, ecco perché una soluzione temporanea era di includerla come pacchetto Nuget. Quando verrà rilasciato il prossimo .NET framework, le classi necessarie per questa funzionalità dovrebbero essere già integrate. In caso contrario, questo è un problema che necessita di una spiegazione.
Zein Makki

11
Dopo aver appena eseguito l'aggiornamento a .NET Framework 4.7 ho ricevuto questo errore, risulta che ValueTuple ora fa parte di 4.7, quindi la disinstallazione del pacchetto tuple è stata la soluzione per me
chad.mellor

50

Ho iniziato a ricevere questo errore dopo aver installato .Net 4.7 Framework e ho modificato il mio progetto in .Net 4.7

ValueTuple è ora incluso con .Net 4.7, quindi non è necessario fare riferimento manualmente a ValueTuple.

Tutto quello che dovevo fare per correggere l'errore di compilazione era rimuovere il riferimento a System.ValueTuple dai riferimenti del mio progetto.


1
Ottimo, ho seguito il tuo suggerimento, ora è incluso in .NET 4.7, non è più necessario installarlo da NuGet. Grazie.
Gengjun Wu

possiamo già usarlo su .net. È il 2019.
Scelgo come

2

Ho anche riscontrato 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 uso dipende da esso.

Finalmente sono stato in grado di individuare la causa principale: c'era una versione .NET 4.6.2 di mscorlib.dllin giro nella cartella del progetto (output di un'operazione di pubblicazione) e MSBuild ha deciso di fare riferimento a questo assembly invece del riferimento ufficiale .NET 4.7.2 assemblaggio 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, la compilazione di MSBuild non è riuscita perché non è stato possibile trovare il tipo nell'assembly di riferimento di .NET 4.6.2.


1

Ho ricevuto anche questo errore dopo l'aggiornamento a .NET 4.7.2 e sono stato in grado di risolverlo reinstallando i pacchetti nuget usando:

Update-Package -Reinstall
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.