J'écris une fonction de filtre pour renvoyer le type spécifique spécifié d'une plus grande collection de supertypes (objets par exemple). L'idée est que je vous donne un énumérable et que vous me rendiez toutes les cordes par exemple. vous pouvez l'écrire de cette façon sans médicaments génériques:Quelle est la manière appropriée de taper fortement le retour d'une fonction générique?
public static IEnumerable Filter(IEnumerable source, Type type)
{
List<object> results = new List<object>();
foreach(object o in source)
{
if(o != null && o.GetType() == type)
{
results.Add(o);
}
}
return results;
}
si nous voulons revenir génériques, il y a plusieurs façons de s'y prendre.
En tant que port droit:
public static IEnumerable<TResult> Filter<TResult>
(IEnumerable source, Type type)
passe dans un 'exemple':
IEnumerable<TResult> Filter<TResult>
(IEnumerable source, TResult resultType)
En fin de compte ce que je pense est plus propre:
public static IEnumerable<T> Filter<T>(IEnumerable source)
Le second type serait appelé entièrement avec des paramètres (et déduire le type):
Filter(myList, "exampleString");
alors que la version finale, il obtiendrait appelé avec un spécificateur de type:
Filter<string>(myList);
Quelle est la manière appropriée de typer le retour d'une fonction générique, où le type de retour n'implique pas automatiquement dans la signature? (Pourquoi?)
(Edit Note: Notre entrée n'est pas typé, par exemple IEnumerable <T> Au mieux, il serait IEnumerable Cette fonction retourne le Ts de toute la collection d'autres types...)
Ainsi, la manière « .net » semble être spécifier le type, ce qui est bon de savoir, je vous remercie. Malheureusement, nous sommes dans un monde 2.0, et nous avons de la chance d'avoir des génériques. –
Oui, je comprends, nous étions coincés avec 2,0 pendant un certain temps ici aussi. Je suppose que le plus proche que vous pourriez obtenir .Net est votre dernière solution. La seule chose manquante serait la méthode d'extension. – Coincoin
J'ai marqué cela comme accepté à cause de la source citée, bonne pensée. –