Délégués et demande de prédicats

J’apprends les lambdas et j’essaie de comprendre pourquoi, tout en ayant la classe EmployeeFilterAge comme ceci:

public class EmployeeFilterAge { int _age; public EmployeeFilterAge(int age) { _age = age; } public bool OlderThan(Employee employee) { return employee._age > _age; } } 

quand j’essaye de faire ceci:

 var filterByAge = new EmployeeFilterAge(29); var del = new AgeExclusion(filterByAge.OlderThan); 

Je reçois une erreur disant “aucune méthode de surcharge … ne correspond au délégué …”, alors que délégué ressemble à cela:

 public delegate bool AgeExclusion(object person); 

Est-ce parce que c’est un prédicat?

Le délégué dit que le paramètre peut être de n’importe quel type. Lorsque quelqu’un invoque la méthode, il peut transmettre un Lion, un Tigre, un Ours (Oh mon !!!) ou tout autre chose qu’il souhaite, et votre méthode doit pouvoir le gérer.

Vous essayez d’affecter une méthode qui ne peut jamais accepter qu’un Employee , et qui n’est pas autorisée à accepter un autre type en tant qu’argument. Il est donc évident que cette méthode n’est pas valide pour affecter une variable de ce type de délégué.

Maintenant, si les types étaient inversés, ce serait bien. Si le délégué indique qu’il peut accepter une méthode prenant uniquement comme argument un Employee , vous pouvez lui atsortingbuer une méthode capable de prendre n’importe quoi comme argument car, après tout, tous les employés qui l’auront adopté le feraient. être des arguments valides pour une méthode qui peut tout accepter. Le terme technique pour cela est contravariance.

Vous essayez de transmettre un groupe de méthodes qui prend un Employee pour un délégué qui prend un object . Cela n’est pas autorisé car l’utilisateur du délégué est autorisé à transmettre un object , alors que le délégué attend un Employee .

Voici comment vous pouvez y remédier:

 AgeExclusion del = e => filterByAge.OlderThan((Employee)e); 

Démo.