J'ai la solution !
Il faudrait simplement rajouter la déclaration de types anonymes ! 
On peut déjà en initialiser... alors rajouter sa déclaration devrait même harmonisé le sens de "var"
Je propose comme écriture :
(int Key, string Value) o;
Voila ! J'ai déclaré "o" de type... le truc entre parenthèses... un type parfaitement définit mais sans nom.
Ainsi "o" s'initialise normalement :
o = new {Key = 1, Value = "toto"};
OK !? Mais à quoi ça sert !?
Et bien maintenant on peut déclarer une méthode de façon claire et précise remplaçant avantageusement toutes les bidouilles de Tuple :
1 2 3 4
| public (int Key, string Value) MaMethode(double x)
{
return new {Key = 1, Value = "toto"};
} |
Avouez que ça fait une belle signature toute propre !
Elle reste parfaitement fonctionnelle car en interne la sortie est un type classique (anonyme mais classique)
La déclaration est parfaitement "explicite" et n'entraine donc aucunement les complications du mot "var" (déclaration implicite) qui ne change pas de rôle.
Ce ne serait pas mieux non !? 
Note 1 : Tuple a des outils pour la comparaison... là je ne sais pas... mais il me semble que le Linq a ce qu'il faut pour gérer nativement les types anonymes... non ?
Note 2 : Aucune utilité... mais en regardant le fonctionnement interne des types anonymes (grâce à la Reflexion), je pense que "o" serait aussi initialisable comme ceci :
o = new (int Key, string Value)(1, "toto");
Note 3 : la déclaration "(Type1 nom1, Type2 nom2, ...)" reste bien sûr à être étudié pour éviter de possibles confits.
Partager