Juste pour ajouter à la réponse de @MichaelMocko. Les Tuples ont quelques problèmes pour le moment :
Vous ne pouvez pas les utiliser dans les arbres d'expression EF.
Ejemplo:
public static (string name, string surname) GetPersonName(this PersonContext ctx, int id)
{
return ctx.Persons
.Where(person => person.Id == id)
// Selecting as Tuple
.Select(person => (person.Name, person.Surname))
.First();
}
La compilation échouera avec l'erreur "An expression tree may not contain a tuple literal". Malheureusement, l'API des arbres d'expression n'a pas été développée pour prendre en charge les tuples lorsque ceux-ci ont été ajoutés au langage.
Suivez (et upvotez) cette question pour les mises à jour : https://github.com/dotnet/roslyn/issues/12897
Pour contourner le problème, vous pouvez d'abord le convertir en type anonyme, puis convertir la valeur en tuple :
// Will work
public static (string name, string surname) GetPersonName(this PersonContext ctx, int id)
{
return ctx.Persons
.Where(person => person.Id == id)
.Select(person => new { person.Name, person.Surname })
.ToList()
.Select(person => (person.Name, person.Surname))
.First();
}
Une autre option consiste à utiliser ValueTuple.Create :
// Will work
public static (string name, string surname) GetPersonName(this PersonContext ctx, int id)
{
return ctx.Persons
.Where(person => person.Id == id)
.Select(person => ValueTuple.Create(person.Name, person.Surname))
.First();
}
Références :
Vous ne pouvez pas les déconstruire en lambdas.
Il y a une proposition pour ajouter le support : https://github.com/dotnet/csharplang/issues/258
Ejemplo:
public static IQueryable<(string name, string surname)> GetPersonName(this PersonContext ctx, int id)
{
return ctx.Persons
.Where(person => person.Id == id)
.Select(person => ValueTuple.Create(person.Name, person.Surname));
}
// This won't work
ctx.GetPersonName(id).Select((name, surname) => { return name + surname; })
// But this will
ctx.GetPersonName(id).Select(t => { return t.name + t.surname; })
Références :
Ils ne sérialisent pas bien
using System;
using Newtonsoft.Json;
public class Program
{
public static void Main() {
var me = (age: 21, favoriteFood: "Custard");
string json = JsonConvert.SerializeObject(me);
// Will output {"Item1":21,"Item2":"Custard"}
Console.WriteLine(json);
}
}
Les noms de champs de tuple ne sont disponibles qu'au moment de la compilation et sont complètement effacés au moment de l'exécution.
Références :