c# visual-studio-2017 c#-7.0

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



visual-studio-2017 c#-7.0 (10)

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

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?


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.


Es parte de .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 a ValueTuple . Haga esto agregando el NuGet Package System.ValueTuple NuGet Package


Estábamos viendo este mismo problema en uno de nuestros antiguos proyectos que apuntaba al Marco 4.5.2. Intenté varios escenarios, incluidos todos los enumerados anteriormente: objetivo 4.6.1, agregar el paquete System.ValueTuple, eliminar 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. Se verificó la ruta de referencia del archivo csproj. 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.



No recomendaría agregar ValueTuple como 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 desde la 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. Teníamos solución con 2 proyectos (simplifico demasiado):

  • Lib
  • Web

Lib estaba incluyendo ValueTuple y Web estaba usando Lib . Resultó que, por alguna razón desconocida, Web al intentar resolver la ruta a ValueTuple estaba teniendo HintPath en el directorio .NET Framework y estaba tomando una versión incorrecta. Nuestra aplicación estaba fallando por eso. ValueTuple no se definió en .csproj de Web ni HintPath para ese ensamblado. 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 referencias del paquete System.* . 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 general: no use el paquete System.* Nuget para .NET Framework si no hay una necesidad real de ellos.

ValueTuple nuestro problema agregando ValueTuple manualmente en el archivo .csproj dentro del proyecto Web .


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

dotnet add package "System.ValueTuple"

No te olvides de ejecutar dotnet restore después.


Para .NET 4.6.2 o inferior, .NET Core 1.xy .NET Standard 1.x necesita instalar el paquete 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.


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 a System.ValueTuple porque 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.dll en la carpeta del proyecto (resultado de una operación de publicación) y MSBuild decidió hacer referencia a este ensamblado en lugar del .NET 4.7 oficial .2 ensamblaje de referencia ubicado 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://.com/a/57777123/128709 )


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