Je suis très étonné par le choix de "Deconstruct"
1 2 3 4 5
| public void Deconstruct(out double x, out double y)
{
x = this.X;
y = this.Y;
} |
Je comprends qu'en interne ils veuillent se reposer sur du C# "ancien" mais pour l'utilisateur final d'aujourd'hui le but des nouveaux "tuples" n'est-il pas justement d'éviter au maximum l'utilisation peu pratique et archaïque de "out" ?
L'utiliser sous cette forme me semblerait plus judicieuse :
public (double x, double y) Deconstruct() => (this.X, this.Y);
Ensuite la possibilité de déclarer directement une variable "out" est une bonne chose... mais pour moi elle repose toujours sur le mauvais choix de continuer à utiliser "out"
AMHA une autre direction comme avec un mécanisme d'"exception light" - quand la gestion d'exception classique n'est pas obligatoire ou trop lourde.
En introduisant par exemple deux nouveaux mots clés, un permettant une sortie incorrecte (sans lancer d'exception) d'une méthode et un autre pour la tester :
1 2 3 4
| if (try int i = int.ParseLight(s))
{
Console.WriteLine($"La chaine représente un entier de valeur {i}");
} |
Et comme je réfléchis en même temps que j'écris... je pense même qu'il serait possible de transformer les Parses avec exceptions classiques pour qu'ils fonctionnent... classiquement et aussi dans un mode light se suffisant d'un simple test booléen comme le code au-dessus.
Sinon avec C# 7 on doit pouvoir écrire cela (bon c'est un peu plus verbeux mais adieux les "out"
):
1 2 3 4
| if (!((bool error, int i) = int.ParseLight2(s)).error)
{
Console.WriteLine($"La chaine représente un entier de valeur {i}");
} |
Autrement dans ton switch Pattern matching ça fonctionnerait un "goto Circle c when c.Radius < 5" ? 
Sinon n'y aurait-il pas une petite faute dans ton exemple sur la généralisation du type de retour des méthodes asynchrones ? AMHA la variable "price" en attente n'est pas déclarée puisqu'avant elle est interne au if.
Partager