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.
Los tipos ValueTuple están integrados en marcos más nuevos:
- .NET Framework 4.7
- .NET Core 2.0
- Mono 5.0
- .Net Standard 2.0
Hasta que apunte a una de esas versiones de framework más nuevas, debe hacer referencia al paquete ValueTuple.
Más detalles en http://blog.monstuff.com/archives/2017/03/valuetuple-availability.html
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:
- haga clic derecho en cada proyecto en solución
- descargar proyecto
- 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>
- guardar cambios y recargar proyectos
- busque System.ValueTuple.dll y guárdelo en esta carpeta
- agregar referencia de este archivo al control de origen
(Opcional): 7. resuelva los mismos problemas con otros archivos .dll de esta manera