Visual Studio 2017 ve C # 7.0 kullanan bir yöntemden Tuple döndürülemiyor


101

Bir hafta önce yayınlanan Visual Studio 2017 Topluluğu'nu yükledim ve C # 7'nin yeni özelliklerini keşfetmeye başladım.

Bu yüzden iki değer döndüren basit bir yöntem oluşturdum:

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

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

Derleyici bir hata oluşturuyor:

Hata CS8137 Derleyici 'System.Runtime.CompilerServices.TupleElementNamesAttribute' türü gerektirdiğinden, tuples kullanan bir sınıf veya üye tanımlanamıyor. Bir referansı mı kaçırıyorsun?

Bu isimde çerçevede bir referans bulmaya çalıştım, ama şanssız!

C # 7.0 özelliklerini kullanmak için ek şeylere ihtiyacımız varsa, bunu her proje için yapmamız çok tuhaf mı?


Yanıtlar:


130

Ben sadece bu sayfa üzerinden koştu Roslyn bu çalışma almak için aşağıdaki adımları açıklar:

  1. Bir C # projesi başlatın
  2. System.ValueTuple NuGet'ten pakete bir başvuru ekleyin (yayın öncesi)

görüntü açıklamasını buraya girin

Bu adımları takip ederek, şimdi çalışıyor. Ama başladığımız her proje için bunu yapmamız gerçekten çok tuhaf! Resmi sürüme ulaştığımızda bu sorun çözülmüştür!


2
Bir sonraki sürümde olması gereken şeylerden biri, paketi kolayca eklemenizi sağlayan bir kod düzeltmesidir.
svick

7
Bu çözüm bana yardımcı oldu; Mart 2017'de indirilen VS2017 Professional'ın tam sürüm sürümünde bile!
Nij

2
Bunun resmi dilde olmaması çok sinirlendi. Bunun düzeltilmesi ile aynı problemle karşılaştım. Bunu bir C # 7 dil özelliği olarak pazarlıyorlar, aslında daha çok bir C # 7 uzantı özelliği. Sanırım yeni Roslyn derleyicisini (hayranıyım) kullandığınızda işler bu kadar tüylü olabilir ... her iki durumda da bu üzücü bir yan etki IMO'su.
Michael Puckett II

10
@MichaelPuckettII Bunun sebebi bence bu özelliğin .NET çerçevesinde var olması için sınıf (lar) a ihtiyaç duyması ve henüz yeni bir tane yayınlamamaları, bu yüzden geçici bir çözüm bunu Nuget Paketi olarak dahil etmekti. Bir sonraki .NET çerçevesi piyasaya sürüldüğünde, bu özellik için gereken sınıflar zaten yerleşik olmalıdır. Değilse, o zaman bu biraz açıklama gerektiren bir sorundur.
Zein Makki

12
NET Framework 4.7'ye yeni yükselttikten sonra bu hatayı aldım, ValueTuple artık 4.7'nin bir parçası, bu yüzden tuple paketini kaldırmak benim için
çözümdü

58

.Net 4.7 Framework kurduktan sonra bu hatayı almaya başladım ve projemi hedef .Net 4.7 olarak değiştirdim.

ValueTuple artık .Net 4.7'ye dahil edilmiştir, bu nedenle ValueTuple'a manuel olarak başvurmanız gerekmez.

Derleme hatasını düzeltmek için tek yapmam gereken System.ValueTuple referansını projemin referanslarından kaldırmaktı.


1
Harika, önerinize uyduk, şimdi .NET 4.7'ye dahil edildi, artık NuGet'ten yüklemenize gerek yok. Teşekkürler.
Gengjun Wu

bunu zaten .net üzerinde kullanabilir miyiz?
2019.

2

NET 4.6.2'den .NET 4.7.2'ye yükseltirken de bu sorunla karşılaştım. Ne yazık ki, System.ValueTuplekullandığım başka bir NuGet paketi buna bağlı olduğundan paket başvurusunu kaldıramadım .

Sonunda temel nedeni bulabildim: mscorlib.dllProje klasöründe ortalamanın bir .NET 4.6.2 sürümü vardı (bir yayınlama işleminin çıktısı) ve MSBuild, resmi .NET 4.7.2 referansı yerine bu derlemeye başvurmaya karar verdi montaj yeri bulunur C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

System.ValueTuple'ın .NET 4.7'de kullanıma sunulması nedeniyle MSBuild, .NET 4.6.2'nin başvuru derlemesinde türü bulamadığı için derlemede başarısız oldu.


2

Bu hatayı da .NET 4.7.2'ye güncelledikten sonra aldım ve nuget paketlerini aşağıdakileri kullanarak yeniden yükleyerek düzeltebildim:

Update-Package -Reinstall
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.