No se puede devolver Tuple desde un método con Visual Studio 2017 y C # 7.0

98

Instalé Visual Studio 2017 Community que se lanzó hace una semana y comencé a explorar las nuevas características de C # 7.

Entonces creé un método simple que devuelve dos valores:

public class Program
{
    public static void Main(string[] args)
    {
        (int sum, int count) a = ReturnTwoValues();
    }

    static (int sum, int count) ReturnTwoValues() => (1, 1);
}

El compilador está generando un error:

Error CS8137 No se puede definir una clase o miembro que utiliza tuplas porque el compilador requería el tipo 'System.Runtime.CompilerServices.TupleElementNamesAttribute' no se puede encontrar. ¿Falta alguna referencia?

Intenté encontrar una referencia en el marco con este nombre, ¡pero sin suerte!

Si necesitamos cosas adicionales para usar las funciones de C # 7.0, ¿es muy extraño que tengamos que hacer eso para cada proyecto?

Zein Makki
fuente
Posible duplicado de Habilitar c # 7 en una aplicación asp.net
Hassan Abdullah

Respuestas:

129

Acabo de leer esta página sobre Roslyn que describe los siguientes pasos para que esto funcione:

  1. Iniciar un proyecto de C #
  2. Agregar una referencia al System.ValueTuple paquete de NuGet (versión preliminar)

ingrese la descripción de la imagen aquí

Siguiendo esos pasos, ahora está funcionando. ¡Pero es realmente muy extraño que tengamos que hacer eso para cada proyecto que comenzamos! ¡Espero que esto se solucione cuando lleguemos al lanzamiento oficial!

Zein Makki
fuente
2
Una cosa que debería estar en la próxima versión es una corrección de código que le permite agregar fácilmente el paquete.
svick
6
Esta solución me ayudó; ¡incluso con la versión de lanzamiento completa de VS2017 Professional, descargada en marzo de 2017!
Nij
2
Muy molesto porque esto no está en el idioma oficial. Me encontré con el mismo problema con esta solución. Están comercializando esto como una característica del lenguaje C # 7 cuando en realidad es más una característica de extensión de C # 7. Supongo que las cosas se pueden poner así de complicadas cuando usas el nuevo compilador de Roslyn (del que soy fan) ... de cualquier manera, este es un efecto secundario triste en mi opinión.
Michael Puckett II
10
@MichaelPuckettII Creo que esto se debe a que esta característica necesita clases para existir en el marco .NET y aún no han lanzado una nueva, por eso una solución temporal fue incluir esto como un paquete Nuget. Cuando se publique el próximo marco .NET, las clases necesarias para esta característica ya deberían estar integradas. Si no, entonces ese es un problema que necesita alguna explicación.
Zein Makki
11
Después de actualizar a .NET Framework 4.7 recibí este error, resulta que ValueTuple ahora es parte de 4.7, así que desinstalar el paquete tuple fue la solución para mí
chad.mellor
50

Comencé a recibir este error después de instalar .Net 4.7 Framework y cambié mi proyecto a .Net 4.7 de destino

ValueTuple ahora se incluye con .Net 4.7, por lo que no tiene que hacer referencia a ValueTuple manualmente.

Todo lo que tuve que hacer para corregir el error de compilación fue eliminar la referencia a System.ValueTuple de las referencias de mi proyecto.

aaaa bbbb
fuente
1
Genial, seguí tu sugerencia, ahora está incluido en .NET 4.7, ya no es necesario instalarlo desde NuGet. Gracias.
Gengjun Wu
¿Podemos usar eso en .net ya? Es 2019.
Apunto a
2

También encontré este problema cuando actualicé 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 él.

Finalmente pude localizar la causa raíz: había una versión .NET 4.6.2 de mscorlib.dlltirada 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 .NET 4.7.2 ensamblaje 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ó en la compilación porque no pudo encontrar el tipo en el ensamblado de referencia de .NET 4.6.2.

Oliver Hanappi
fuente
1

También obtuve este error después de actualizar a .NET 4.7.2 y pude solucionarlo reinstalando los paquetes nuget usando:

Update-Package -Reinstall
martinosa
fuente