Décorer les paramètres avec OptionalAttribute ne fonctionne pas non plus. Pour étendre l'échantillon précédent, vous obtiendriez quelque chose comme :
private void Func(
[Optional] out int optional1,
[Optional] out string optional2)
{ /* ... */ }
Notez que ce qui précède sera compilé (peut-être malheureusement). Cependant, en essayant de compiler :
Func(out i);
échouera sauf si une surcharge avec une signature à un paramètre est explicitement fournie.
Faire fonctionner (théoriquement) ce qui précède est un problème important. Lorsqu'une méthode avec un paramètre optionnel omis est appelée, un cadre de pile contenant les valeurs de tous les paramètres est créé, et la ou les valeurs manquantes sont simplement remplies avec les valeurs par défaut spécifiées.
Cependant, un paramètre "out" est une référence, pas une valeur. Si ce paramètre est optionnel et non fourni, quelle variable référencerait-il ? Le compilateur doit toujours faire respecter l'exigence selon laquelle le paramètre "out" doit être rempli avant tout retour normal de la méthode, car le compilateur ne sait pas a priori quels paramètres facultatifs (s'il y en a) sont spécifiés par un appelant. Cela signifie qu'une référence à la variable fictive quelque part doit être passée pour que la méthode ait quelque chose à remplir. La gestion de cet espace variable factice créerait un méchant mal de tête pour le rédacteur du compilateur. Je ne dis pas qu'il serait impossible de travailler sur les détails de ce fonctionnement, mais les implications architecturales sont suffisamment importantes pour que Microsoft ait renoncé à cette fonctionnalité.
0 votes
Je ne vois pas l'intérêt d'une telle fonctionnalité. Si vous avez déjà écouté les sessions des compilateurs C# sur PDC, vous verrez que chaque changement a une signification.
52 votes
Je ne suis pas d'accord pour dire que cette fonctionnalité n'a aucune valeur. Si une méthode contient une certaine logique EN PLUS de renvoyer des données via les paramètres de sortie, je veux être capable d'appeler cette logique, mais je n'ai pas besoin de la sortie...
3 votes
J'utilise Int32.TryParse() pour voir si la chaîne donnée peut être analysée en un nombre et, si c'est le cas, c'est parfois tout ce qui m'importe. Jitbit a donc raison.
1 votes
Il peut être pratique de capturer optionnellement les informations de la chaîne latérale d'une fonction. De plus, si VB l'a, pourquoi pas le C# ? Il devrait surcharger automatiquement.