Inférence de type C # d'un paramètre de type de méthode générique où la méthode n'a pas d'argument
-
20-08-2019 - |
Question
Étant donné l'interface générique et la classe d'implémentation suivantes:
public interface IRepository<T> {
// U has to be of type T of a subtype of T
IQueryable<U> Find<U>() where U : T;
}
public class PersonRepository : IRepository<Employee> {
}
Comment puis-je appeler la méthode Find sans spécifier U?
var repository = new EmployeeRepository();
// Can't be done
IQueryable<Employee> people = repository.Find();
// Has to be, but isn't Employee a given in this context?
IQueryable<Employee> people = repository.Find<Employee>();
// Here I'm being specific
IQueryable<Manager> managers = repository.Find<Manager>();
En d’autres termes, que peut-on faire pour obtenir une inférence de type?
Merci!
La solution
Que diriez-vous d'écrire
var people = repository.Find<Employee>();
Cela enregistre la même quantité de frappe, mais d'une manière différente.
Autres conseils
Comment appeler la méthode Find sans préciser U?
Vous ne pouvez pas.
Malheureusement, la résolution de surcharge de la méthode générique de C # ne correspond pas en fonction des valeurs de retour.
Voir le blog d'Eric Lippert à ce sujet: L'inférence de type de retour C # 3.0 ne fonctionne pas sur les groupes de méthodes
Mais un moyen facile d'écrire cela consiste à utiliser var
mot clé.
var employees = repository.Find<Employee>();