El tipo predefinido 'System.ValueTuple´2´ no está definido o importado


385

Instalé Visual Studio 15 Preview 3 e intenté usar la nueva función de tupla

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

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

Cuando compilo me sale el error:

El tipo predefinido 'System.ValueTuple´2´ no está definido o importado

Según la publicación del blog , estas características deberían estar "activadas" de forma predeterminada.

¿Qué hice mal?


3
¿Alguien sabe si se requiere el paquete NuGet incluso en 2017 RTM apuntando 4.6.2? Parece que todavía lo necesitas y esperaba que no lo hicieras en la versión final.
dmeglio

puede intentar usar System.Tuple <int, int> en su lugar
Kevin Xiao

Para mí, esta stackoverflow.com/a/46533630/4383425 fue la solución.
Andre

Respuestas:


528

Para .NET 4.6.2 o inferior, .NET Core 1.xy .NET Standard 1.x necesita instalar el paquete NuGet System.ValueTuple:

Install-Package "System.ValueTuple"

O usando una referencia de paquete en VS 2017:

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

.NET Framework 4.7, .NET Core 2.0 y .NET Standard 2.0 incluyen estos tipos.


3
Gracias. ¿Significa que funcionaría con 4.6.2? El depurador todavía muestra x.Item1 x.Item2. En lugar de (xx y xy) ¿Sabes si eso cambiará?
gsharp

2
Paquete de instalación "System.ValueTuple" -IncludePrerelease
Frison Alexander el

14
Bueno, no parece estar en 4.6.2.
binki

12
Funciona con 4.6.2, aunque aún necesita este paquete.
Elisabeth

8
Con .NET 4.7, el paquete se incluye de forma nativa.
Mafii

40

Es parte de la .NET Framework 4.7.

Siempre que no apunte al marco anterior o superior (o .NET Core 2.0/ .NET Standard 2.0), deberá hacer referencia ValueTuple. Haga esto agregando elSystem.ValueTuple NuGet Package


1
¿Acabo de probar con .net 4.7 y no funcionó? System.ValueTuple`2no encontrado
Bidou

He instalado .net Framework 4.7 y el paquete de destino para Visual Studio. También seleccioné la versión 4.7 en el menú desplegable, pero aún no se compila.
Bidou

10
Ok, acabo de encontrar el problema: el dll System.ValueTuple estaba codificado en mi archivo de proyecto (csproj). Eliminar esta entrada del archivo del proyecto solucionó el problema.
Bidou

Buena solución, pero puede agregar más detalles. En mi caso, System.ValueTuple.dll todavía estaba colgando en mi carpeta bin. Una vez que eliminé eso, estaba listo para comenzar. Mi versión de idioma está en defaulty todo está funcionando.
toddmo


5

Para Visual Studio Code, use el Terminal incorporado y ejecute:

dotnet add package "System.ValueTuple"

No te olvides de correr dotnet restoredespués.


No he podido hacer que esto funcione en VS Code.
JonathanPeel

10
Nota: No haga esto con .Net 4.7
toddmo

3

Asegúrese de tener instalado .NET 4.6.2 Developer Pack para VS instalado y luego extraiga el System.ValueTuplepaquete de NuGet.


2
Incluso con .NET 4.6.2 parece que todavía necesita el paquete System.ValueTuple.
HaveSpacesuit

3
@mrsundquist, sí, cualquier cosa por debajo de 4.7
toddmo

3

En caso de que otros tengan el mismo problema, me encontré con este error después de actualizar un proyecto a 4.7. Por extraño que parezca, tuve que eliminar la referencia System.ValueTuple para que este error desapareciera.


3

No recomendaría agregar ValueTuplecomo referencia de paquete a los proyectos de .net Framework. Como saben, este ensamblaje está disponible en 4.7 .NET Framework.

Puede haber ciertas situaciones en las que su proyecto intentará incluir a toda costa ValueTuple carpeta .NET Framework en lugar de la carpeta del paquete y puede causar algunos errores de ensamblado que no se encuentran.

Tuvimos este problema hoy en compañía. Tuvimos una solución con 2 proyectos (simplifico demasiado):

  • Lib
  • Web

Libestaba incluyendo ValueTuple y Webestaba usando Lib. Resultó que por alguna razón desconocida Webal intentar resolver la ruta ValueTupleestaba teniendo HintPathen el directorio .NET Framework y estaba tomando una versión incorrecta. Nuestra aplicación estaba fallando por eso. ValueTupleno se definió en .csprojde Webni HintPathpara que el montaje. El problema fue muy raro. Normalmente copiaría el ensamblado de la carpeta del paquete. Esta vez no fue normal.

Para mí siempre es un riesgo agregar System.*referencias de paquetes. A menudo son como una bomba de tiempo. Están bien al principio y pueden explotar en tu cara en el peor momento. Mi regla de oro: no use el System.*paquete Nuget para .NET Framework si no hay una necesidad real de ellos.

Resolvimos nuestro problema agregando manualmente ValueTupleal .csprojarchivo dentro del Webproyecto.


1

También me encontré con este problema al actualizar de .NET 4.6.2 a .NET 4.7.2. Desafortunadamente, no pude eliminar la referencia del paquete System.ValueTupleporque otro paquete NuGet que uso depende de ello.

Finalmente pude localizar la causa raíz: había una versión .NET 4.6.2 de mscorlib.dllestar en la carpeta del proyecto (resultado de una operación de publicación) y MSBuild decidió hacer referencia a este ensamblado en lugar de la referencia oficial de .NET 4.7.2 Asamblea ubicada en C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

Debido al hecho de que System.ValueTuple se introdujo en .NET 4.7, MSBuild falló la compilación porque no pudo encontrar el tipo en el ensamblado de referencia de .NET 4.6.2.

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


0

Tuve que comprobar que el archivo System.ValueTuple.dll estaba bajo control de origen y corregir su referencia en archivos .cssproj:

  1. haga clic derecho en cada proyecto en solución
  2. descargar proyecto
  3. editar archivo .cssproj: cambiar

<Referencia Incluir = "System.ValueTuple">

<HintPath>

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

</ HintPath>

</ Referencia>

dentro

<Referencia Incluir = "System.ValueTuple">

<HintPath>

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

</ HintPath>

</ Referencia>

  1. guardar cambios y recargar proyectos
  2. busque System.ValueTuple.dll y guárdelo en esta carpeta
  3. agregar referencia de este archivo al control de origen

(Opcional): 7. resuelva los mismos problemas con otros archivos .dll de esta manera


1
La codificación dura de una ruta de archivo fija (o cualquier cadena) nunca es una buena solución.
Arghya C

0

Estábamos viendo este mismo problema en uno de nuestros viejos proyectos que apuntaba al Marco 4.5.2. Probé varios escenarios, incluidos todos los enumerados anteriormente: objetivo 4.6.1, agregue el paquete System.ValueTuple, elimine las carpetas bin, obj y .vs. No dados. Repita el mismo proceso para 4.7.2. Luego intenté eliminar el paquete System.ValueTuple ya que estaba apuntando a 4.7.2 como sugirió un comentarista. Aún nada. Ruta de referencia del archivo csproj marcada Se ve bien Incluso volvió a bajar a 4.5.2 e instaló el paquete nuevamente. Todo esto con varios reinicios de VS y eliminando las mismas carpetas varias veces. Literalmente nada funcionó.

Tuve que refactorizar para usar una estructura en su lugar. Espero que otros no sigan teniendo este problema en el futuro, pero pensé que esto podría ser útil si terminas tan perplejo como nosotros.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.