O tipo predefinido 'System.ValueTuple´2' não está definido ou importado


385

Instalei o Visual Studio 15 Preview 3 e tentei usar o novo recurso de tupla

static void Main(string[] args)
{
    var x = DoSomething();
    Console.WriteLine(x.x);
}

static (int x, int y) DoSomething()
{
    return (1, 2);
}

Ao compilar, recebo o erro:

O tipo predefinido 'System.ValueTuple´2' não está definido ou importado

De acordo com a postagem do blog , esses recursos devem estar "ativados" por padrão.

O que eu fiz errado?


3
Alguém sabe se o pacote NuGet é necessário mesmo no 2017 RTM targeting 4.6.2? Parece que você ainda precisa e eu esperava que não fosse na versão final.
precisa saber é

você pode tentar usar System.Tuple <int, int> vez
Kevin Xiao

Para mim, este stackoverflow.com/a/46533630/4383425 foi a solução.
27418 Andre Andre

Respostas:


528

Para .NET 4.6.2 ou inferior, .NET Core 1.xe .NET Standard 1.x, você precisa instalar o pacote NuGet System.ValueTuple:

Install-Package "System.ValueTuple"

Ou usando uma referência de pacote no VS 2017:

<PackageReference Include="System.ValueTuple" Version="4.4.0" />

O .NET Framework 4.7, o .NET Core 2.0 e o .NET Standard 2.0 incluem esses tipos.


3
Obrigado. Isso significa que funcionaria com 4.6.2? O depurador ainda mostra x.Item1 x.Item2. Em vez de (xx e xy) Você sabe se isso vai mudar?
Gsharp

2
Pacote de instalação "System.ValueTuple" -IncludePrerelease
Frison Alexander

14
Bem, não parece estar no 4.6.2.
binki

12
Funciona com 4.6.2, ainda precisa deste pacote.
Elisabeth

8
Com o .NET 4.7, o pacote é incluído nativamente.
Mafii

40

Faz parte do .NET Framework 4.7.

Desde que você não tenha como alvo a estrutura acima ou superior (ou .NET Core 2.0/ .NET Standard 2.0), precisará fazer referência ValueTuple. Faça isso adicionando oSystem.ValueTuple NuGet Package


11
Eu apenas tentei com .net 4.7 e não funcionou? System.ValueTuple`2não encontrado
Bidou

Instalei o .net Framework 4.7 e o pacote de destino do Visual Studio. Também selecionei a versão 4.7 no menu suspenso, mas ela ainda não é compilada.
Bidou

10
Ok, acabei de encontrar o problema: a dll System.ValueTuple foi codificada no meu arquivo de projeto (csproj). A remoção desta entrada do arquivo do projeto corrigiu o problema.
Bidou 4/17

Boa solução, mas você pode adicionar mais detalhes. No meu caso, o System.ValueTuple.dll ainda estava na minha pasta bin. Depois de excluir isso, eu estava pronto para ir. Minha versão do idioma está em defaulte tudo está funcionando.
Toddmo 8/05


5

Para o Visual Studio Code, use o Terminal interno e execute:

dotnet add package "System.ValueTuple"

Não se esqueça de correr dotnet restoredepois.


Não consegui fazer isso funcionar no VS Code.
JonathanPeel

10
Nota: Não faça isso com o .Net 4.7
toddmo 8/17/17


3

Caso outras pessoas tenham o mesmo problema, encontrei este erro após atualizar um projeto para 4.7. Curiosamente, tive que remover a referência System.ValueTuple para que esse erro desaparecesse.


3

Eu não recomendaria adicionar ValueTuplecomo referência de pacote aos projetos do .NET Framework. Como você sabe, esse assembly está disponível no 4.7 .NET Framework.

Pode haver certas situações em que seu projeto tentará incluir a todo custo ValueTupleda pasta do .NET Framework em vez da pasta do pacote e isso pode causar alguns erros de montagem não encontrados.

Hoje tivemos esse problema na empresa. Tivemos solução com 2 projetos (eu simplifiquei demais):

  • Lib
  • Web

Libestava incluindo ValueTuple e Webestava usando Lib. Aconteceu que, por algum motivo desconhecido, Webao tentar resolver o caminho, ValueTupleestava HintPathno diretório do .NET Framework e estava usando a versão incorreta. Nosso aplicativo estava travando por causa disso. ValueTuplenão foi definido no .csprojda Webnem HintPathpara que a montagem. O problema era muito estranho. Normalmente, ele copiava o assembly da pasta package. Desta vez não era normal.

Para mim, é sempre um risco adicionar System.*referências de pacotes. Eles são frequentemente como bomba-relógio. Eles estão bem no começo e podem explodir na sua cara no pior momento. Minha regra geral: não use o System.*pacote Nuget para .NET Framework se não houver necessidade real deles.

Resolvemos nosso problema adicionando manualmente ValueTupleno .csprojarquivo dentro Webdo projeto.


1

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

Finalmente, consegui localizar a causa raiz: havia uma versão do .NET 4.6.2 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 o System.ValueTuple ter sido introduzido no .NET 4.7, o MSBuild falhou na compilação porque não conseguiu encontrar o tipo no assembly de referência do .NET 4.6.2.

(duplicado de https://stackoverflow.com/a/57777123/128709 )


0

Eu tive que verificar o arquivo System.ValueTuple.dll estava sob controle de origem e corrija sua referência nos arquivos .cssproj:

  1. clique com o botão direito em cada projeto em solução
  2. descarregar projeto
  3. editar arquivo .cssproj: alterar

<Referência Incluir = "System.ValueTuple">

<HintPath>

.... \ ProjectName \ ProjectName \ obj \ Release \ Package \ PackageTmp \ bin \ System.ValueTuple.dll

</ HintPath>

</ Referência>

para dentro

<Referência Incluir = "System.ValueTuple">

<HintPath>

.. \ packages \ System.ValueTuple.4.4.0 \ lib \ netstandard1.0 \ System.ValueTuple.dll

</ HintPath>

</ Referência>

  1. salvar alterações e recarregar projetos
  2. encontre System.ValueTuple.dll e salve-o nesta pasta
  3. adicione referência desse arquivo ao controle de origem

(Opcional): 7. resolva os mesmos problemas com outros arquivos .dll dessa maneira


11
Codificar permanentemente um caminho de arquivo fixo (ou qualquer string) nunca é uma boa solução.
Arghya C

0

Estávamos vendo esse mesmo problema em um de nossos projetos antigos que tinha como alvo o Framework 4.5.2. Tentei vários cenários, incluindo todos os listados acima: destino 4.6.1, adicione o pacote System.ValueTuple, exclua as pastas bin, obj e .vs. Sem dados. Repita o mesmo processo para 4.7.2. Em seguida, tentei remover o pacote System.ValueTuple desde que eu estava focando na 4.7.2, como sugeriu um comentarista. Nada ainda. Caminho de referência do arquivo csproj verificado. Parece certo. Inclusive caiu para a 4.5.2 e instalou o pacote novamente. Tudo isso com vários VS reinicia e exclui as mesmas pastas várias vezes. Literalmente nada funcionou.

Eu tive que refatorar para usar uma estrutura. Espero que outras pessoas não continuem a enfrentar esse problema no futuro, mas pensaram que isso poderia ser útil se você acabar tão empolgado quanto nós.

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.