Não é possível retornar Tupla de um método usando Visual Studio 2017 e C # 7.0


98

Instalei o Visual Studio 2017 Community que foi lançado há uma semana e comecei a explorar os novos recursos do C # 7.

Portanto, criei um método simples que retorna dois valores:

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

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

O compilador está gerando um erro:

Erro CS8137 Não é possível definir uma classe ou membro que utiliza tuplas porque o tipo necessário do compilador 'System.Runtime.CompilerServices.TupleElementNamesAttribute' não pode ser encontrado. Você está faltando uma referência?

Tentei encontrar uma referência no framework com esse nome, mas sem sorte!

Se precisarmos de coisas adicionais para usar os recursos do C # 7.0, é muito estranho precisarmos fazer isso para todos os projetos ?!


Respostas:


129

Acabei de ler esta página em Roslyn que descreve as seguintes etapas para fazer isso funcionar:

  1. Inicie um projeto C #
  2. Adicione uma referência ao System.ValueTuple pacote do NuGet (pré-lançamento)

insira a descrição da imagem aqui

Seguindo essas etapas, agora está funcionando. Mas é realmente muito estranho que precisemos fazer isso para cada projeto que iniciamos! Espero que isso seja corrigido quando chegarmos ao lançamento oficial!


2
Uma coisa que deve estar na próxima versão é uma correção de código que permite adicionar o pacote facilmente.
svick

6
Essa solução me ajudou; mesmo com a versão de lançamento completa do VS2017 Professional, baixado em março de 2017!
Nij,

2
Muito aborrecido por não estar na língua oficial. Tive o mesmo problema por ser esta a solução. Eles estão anunciando isso como um recurso da linguagem C # 7, quando na verdade é mais um recurso de extensão do C # 7. Eu acho que as coisas podem ficar complicadas assim quando você está usando o novo compilador Roslyn (do qual sou um fã) ... de qualquer forma, este é um triste efeito colateral, IMO.
Michael Puckett II

10
@MichaelPuckettII Acho que isso ocorre porque esse recurso precisa da existência de classe (s) no .NET framework e eles ainda não lançaram uma nova, por isso uma solução temporária foi incluir isso como um pacote Nuget. Quando a próxima estrutura .NET for lançada, as classes necessárias para esse recurso já devem estar integradas. Se não, esse é um problema que precisa de alguma explicação.
Zein Makki

11
Depois de apenas atualizar para .NET Framework 4.7, recebi este erro, parece que ValueTuple agora faz parte do 4.7, então desinstalar o pacote de tupla foi a solução para mim
chad.mellor

50

Comecei a receber este erro depois de instalar o .Net 4.7 Framework e mudei meu projeto para o .Net 4.7

ValueTuple agora está incluído no .Net 4.7, então você não precisa fazer referência ao ValueTuple manualmente.

Tudo que tive que fazer para corrigir o erro de compilação foi remover a referência a System.ValueTuple das referências do meu projeto.


1
Ótimo, seguiu sua sugestão, agora está incluso no .NET 4.7, não precisa mais instalar do NuGet. Obrigado.
Gengjun Wu

podemos usar isso em .net já. É 2019. Tenho como alvo .net 4.7.2
user4951

2

Também me deparei com esse problema ao atualizar do .NET 4.6.2 para o .NET 4.7.2. Infelizmente, não consegui remover a referência do pacote System.ValueTupleporque outro pacote NuGet que uso depende dele.

Por fim, consegui localizar a causa raiz: havia uma versão do .NET 4.6.2 oculta mscorlib.dllna pasta do projeto (saída de uma operação de publicação) e o MSBuild decidiu fazer referência a esse assembly em vez da referência oficial do .NET 4.7.2 montagem localizada em C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

Devido ao fato de que System.ValueTuple foi introduzido no .NET 4.7, o MSBuild falhou na compilação porque não conseguiu localizar o tipo no assembly de referência do .NET 4.6.2.


1

Também recebi este erro depois de atualizar para .NET 4.7.2 e fui capaz de corrigi-lo reinstalando pacotes nuget usando:

Update-Package -Reinstall
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.