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 ?!

Zein Makki
fonte
Possível duplicata de Habilitando c # 7 em um aplicativo asp.net
Hassan Abdullah

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!

Zein Makki
fonte
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.

aaaa bbbb
fonte
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.

Oliver Hanappi
fonte
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
Martinoss
fonte