Nie można zwrócić krotki z metody przy użyciu programu Visual Studio 2017 i C # 7.0

101

Zainstalowałem Visual Studio 2017 Community, które zostało wydane tydzień temu i zacząłem odkrywać nowe funkcje C # 7.

Stworzyłem więc prostą metodę, która zwraca dwie wartości:

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

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

Kompilator generuje błąd:

Błąd CS8137 Nie można zdefiniować klasy lub elementu członkowskiego, który używa krotek, ponieważ nie można znaleźć wymaganego przez kompilator typu „System.Runtime.CompilerServices.TupleElementNamesAttribute”. Brakuje Ci referencji?

Próbowałem znaleźć odniesienie w ramach o tej nazwie, ale bez powodzenia!

Jeśli potrzebujemy dodatkowych rzeczy do korzystania z funkcji C # 7.0, to jest bardzo dziwne, że musimy to robić dla każdego projektu ?!

Zein Makki
źródło
Możliwy duplikat włączania C # 7 w aplikacji asp.net
Hassan Abdullah

Odpowiedzi:

130

Właśnie przejrzałem tę stronę w Roslyn, która opisuje następujące kroki, aby to działało:

  1. Uruchom projekt C #
  2. Dodaj odwołanie do System.ValueTuple pakietu z NuGet (wersja wstępna)

wprowadź opis obrazu tutaj

Po tych krokach teraz działa. Ale to naprawdę bardzo dziwne, że musimy to robić dla każdego projektu, który zaczynamy! Mam nadzieję, że problem zostanie rozwiązany, gdy dotrzemy do oficjalnej wersji!

Zein Makki
źródło
2
Jedna rzecz, która powinna znaleźć się w następnej wersji, to poprawka kodu, która pozwoli Ci łatwo dodać pakiet.
svick
7
To rozwiązanie pomogło mi; nawet z pełną wersją VS2017 Professional, pobraną w marcu 2017!
Nij
2
Bardzo zirytowany, że to nie jest w języku oficjalnym. Wpadłem na ten sam problem, ponieważ jest to poprawka. Reklamują to jako funkcję języka C # 7, podczas gdy w rzeczywistości jest to bardziej funkcja rozszerzenia C # 7. Wydaje mi się, że rzeczy mogą stać się tak owłosione, gdy używasz nowego kompilatora Roslyn (którego jestem fanem) ... tak czy inaczej, jest to smutny efekt uboczny IMO.
Michael Puckett II
10
@MichaelPuckettII Myślę, że dzieje się tak dlatego, że ta funkcja wymaga klas (klas), aby istniały we frameworku .NET, a oni nie wydali jeszcze nowej, dlatego tymczasowym rozwiązaniem było włączenie tego jako pakietu Nuget. Kiedy zostanie wydana kolejna platforma .NET Framework, klasy potrzebne dla tej funkcji powinny być już wbudowane. Jeśli nie, to jest to problem, który wymaga wyjaśnienia.
Zein Makki
12
Po aktualizacji do .NET Framework 4.7 otrzymałem ten błąd, okazuje się, że ValueTuple jest teraz częścią 4.7, więc odinstalowanie pakietu krotki było dla mnie rozwiązaniem
chad.mellor
58

Zacząłem otrzymywać ten błąd po zainstalowaniu .Net 4.7 Framework i zmieniłem projekt na docelowy .Net 4.7

ValueTuple jest teraz dołączony do .Net 4.7, więc nie musisz ręcznie odwoływać się do ValueTuple.

Wszystko, co musiałem zrobić, aby naprawić błąd kompilacji, to usunąć odwołanie do System.ValueTuple z odniesień do mojego projektu.

aaaa bbbb
źródło
1
Świetnie, zastosowałem się do Twojej sugestii, teraz jest uwzględniony w .NET 4.7, nie trzeba już instalować z NuGet. Dzięki.
Gengjun Wu
czy możemy już tego użyć na .net. Jest rok 2019.
Celuję w
2

Napotkałem również ten problem podczas uaktualniania z .NET 4.6.2 do .NET 4.7.2. Niestety, nie udało mi się usunąć odwołania do pakietu, System.ValueTupleponieważ od niego zależy inny pakiet NuGet, którego używam.

Wreszcie udało mi się zlokalizować główną przyczynę: mscorlib.dllw folderze projektu znajdowała się wersja .NET 4.6.2 (dane wyjściowe operacji publikowania) i program MSBuild zdecydował się odwołać do tego zestawu zamiast do oficjalnej dokumentacji .NET 4.7.2 zespół znajdujący się w C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

Ze względu na fakt, że System.ValueTuple został wprowadzony w .NET 4.7, kompilacja programu MSBuild nie powiodła się, ponieważ nie można znaleźć typu w zestawie referencyjnym programu .NET 4.6.2.

Oliver Hanappi
źródło
2

Otrzymałem również ten błąd po aktualizacji do .NET 4.7.2 i mogłem go naprawić, ponownie instalując pakiety NuGet przy użyciu:

Update-Package -Reinstall
martinoss
źródło