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

StackOverflow https://stackoverflow.com/questions/487373

  •  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!

Était-ce utile?

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>();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top