J'étais en train de câbler un événement pour utiliser un lambda qui devait s'enlever après le déclenchement. Je ne pouvais pas le faire en insérant le lambda à l'événement + = (aucune variable accessible à utiliser pour supprimer l'événement) donc j'ai mis en place une variable Action<object, EventArgs>
et y ai déplacé le lambda. L'erreur principale était qu'il ne pouvait pas convertir un Action<object, EventArgs>
en EventHandler. Je pensais que les expressions lambda étaient implicitement convertibles en gestionnaires d'événements, pourquoi cela ne fonctionne-t-il pas?Action <objet, EventArgs> n'a pas pu être converti en EventHandler?
Répondre
lambdas sont implicitement convertibles à déléguer types avec la bonne forme, mais deux types de déléguer, en forme ne sont pas implicitement convertibles les uns aux autres. Faites simplement en sorte que la variable locale ait le type EventHandler à la place.
EventHandler h = (o, ea) => { ... };
e += h;
...
e -= h;
(dans le cas où il aide:
Action<object, EventArgs> a = (o, ea) => { };
EventHandler e = a; // not allowed
EventHandler e2 = (o,ea) => a(o,ea); // ok
)
Vous pouvez utiliser une méthode anonyme à la place:
Event += (sender, e) =>
{
// Multiple lines
// of code here
};
Ce point est tout .... J'ai un ensemble up seulement stocké dans une variable que je peux avoir l'événement se retirer lorsqu'il est viré, seulement cela ne fonctionnera pas. – RCIX
déclarez la variable comme EventHandler et vous devriez être OK ... –
En général, les délégués ne peuvent pas être jeté parce qu'il n'a pas de définition arbre d'héritage qui moulages sont valides. À cette fin, vous avez deux choix:
- Utilisez une variable de type
EventHandler
au lieu duAction<T1, T2>
Utilisez une déclaration en ligne.
// option 1: local variable EventHandler eh = (o, ea) => { /* [snip] */ }; obj.event += eh; obj.event -= eh; // option 2: inline declaration obj.event += (o, ea) => { /* [snip] */ };
Le point entier de l'utilisation d'une variable était de pouvoir supprimer l'événement du gestionnaire d'événements toujours à l'intérieur de l'événement. Encore, +1. – RCIX
Action<Object, EventArgs> a = (o, ea) => { };
EventHandler e = a.Invoke;
C'est vraiment intelligent. –
Déclarez votre événement
public event Action<object, EventArgs> e;
Ensuite, vous pouvez ajouter directement votre action:
Action<object, EventArgs> a = something;
e += a;
- 1. subsonic 3 - Objet de type 'System.Byte []' ne peut pas être converti en type 'System.String'
- 2. system.LinQ.Iqueryable (date) ne peut pas être converti en date
- 3. L'application Ruby on Rails n'a pas pu être démarrée
- 4. Subsonic: L'objet de type 'System.UInt64' ne peut pas être converti en type 'System.Int64'
- 5. L'instruction "<address>" référencé la mémoire à "<address>". La mémoire n'a pas pu être lue."
- 6. appel de fonction n'a pas pu être évalué a expiré
- 7. Le nom distant n'a pas pu être résolu
- 8. Erreur MSB4062: La tâche "GenerateAndPersistAppInfoTask" n'a pas pu être chargée
- 9. Le framework client ASP.NET Ajax n'a pas pu être chargé
- 10. Le nom distant n'a pas pu être résolu
- 11. le manifeste peut ne pas être valide ou le fichier n'a pas pu être ouvert
- 12. L'objet de type 'System.Reflection.ParameterInfo' ne peut pas être converti en type 'System.Int32'
- 13. Erreur: System.Data.Linq.Binary 'ne peut pas être converti en' tableau multidimensionnel de Byte '
- 14. Linq, VB - Type anonyme ne peut pas être converti en type anonyme
- 15. classe Zend_Test_PHPUnit_ControllerTestCase n'a pu être trouvée
- 16. La demande n'a pas pu être soumise pour traitement en arrière-plan?
- 17. L'identificateur en plusieurs parties "DB1..Students.studentnumber" n'a pas pu être lié
- 18. Erreur SQL: l'identificateur en plusieurs parties "tableName.ColumnName" n'a pas pu être lié
- 19. Assistance sur une requête SQL - L'identifiant en plusieurs parties n'a pas pu être lié
- 20. "Le domaine spécifié n'existe pas ou n'a pas pu être contacté"
- 21. Erreur "L'opération n'a pas pu être terminée" lorsque les utilisateurs tentent de se connecter à TFS
- 22. Le tableau Javascript indexé par des chaînes ne peut pas être converti en JSON en utilisant JSON.stringify?
- 23. Comment convertir un type de valeur converti en objet en chaîne à l'aide de XmlConvert?
- 24. C++ erreur, "n'a pas pu en déduire l'argument pour 'std ..."
- 25. ipod touch kCLErrorDomain Code = 0 Opération N'a pu être complétée
- 26. InternalsVisibleTo provoque une erreur CS0246: Le type ou espace de noms n'a pas pu être trouvé
- 27. "Le format de l'URI n'a pas pu être déterminé" avec WebRequest
- 28. CE SQL Server "le module n'a pas pu être trouvé" Crash
- 29. objet ne prend pas en charge cette action dans IE6 avec jQuery
- 30. WSE3003: La chaîne d'approbation du certificat n'a pas pu être vérifiée
Sauf que e2 passe maintenant par deux appels de fonction pour réellement faire n'importe quoi ... eww. –
Je ne suis pas en train de promouvoir e2 comme un bon moyen d'écrire du code, je l'utilise juste comme un exemple pour montrer ce qui est légal ou pas en ce qui concerne le système de type C#. – Brian
@Matthew Scharley - avez-vous mesuré les frais généraux? –