IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Lambda expression incompatible avec System.Delegate ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut Lambda expression incompatible avec System.Delegate ?
    Bonjour à tous,

    Je rencontre un petit problème au niveau des lambdas expressions.

    Voici un code qui, initialement, marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private delegate void WindowInvokeHandler();
     
    public static void close()
    {
        //...
     
        Application.window.Invoke(new WindowInvokeHandler(Application.window.Close()));
     
        //...
    }
    Par contre, lorsque j'essye de remplacer mon delegate par une lambda expression comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static void close()
    {
        //...
     
        Application.window.Invoke(() => Application.window.Close());
     
        //...
    }
    J'obtiens l'erreur:
    Citation Envoyé par Visual Studio
    Impossible de convertir expression lambda en type 'System.Delegate', car il ne s'agit pas d'un type délégué.
    Mais si je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private delegate void WindowInvokeHandler();
     
    public static void close()
    {
        //...
        WindowInvokeHandler wih = () => Application.window.Close();
        Application.window.Invoke(wih);
        //...
    }
    ça marche parfaitement...

    Donc là je suis perplexe... quelle est, au final, la différence entre les deux dernières versions ? Je suis pas trop expert des lambdas expressions, donc je ne vois vraiment pas...
    Surtout que:
    WindowInvokeHandler = lambda expression //OK
    Invoke(System.Delegate = WindowInvokeHandler) //OK

    Donc conclusion : Invoke(System.Delegate = lambda expression) devrait marcher non?
    Non ?

    Donc voilà, si quelqu'un voit mon erreur et peut m'éclairer...
    Je vous remercie par avance !

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Oui c'est un peu tricky!
    Ca devrait fonctionner:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.window.Invoke(new WindowInvokeHandler(()=> Application.window.Close()));
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.window.Invoke((WindowInvokeHandler)()=>Application.window.Close());

  3. #3
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Salut, merci de ta reponse,

    Citation Envoyé par Nathanael Marchand Voir le message
    Oui c'est un peu tricky!
    Ca devrait fonctionner:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.window.Invoke(new WindowInvokeHandler(()=> Application.window.Close()));
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.window.Invoke((WindowInvokeHandler)()=>Application.window.Close());
    Je confirme ca fonctione...


    Je vais garder cette syntaxe je crois, mais je cromprends toujours pas pourquoi je suis oblige de declare un type delegate pour ca...

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    C'est comme 1 et 1.0f Ce sont tous les deux 1 mais ils ne sont pas du même type
    Une lambda même si elle a la même signature n'est pas du type du délégué attendu.

  5. #5
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Certes, certes, mais puisqu'on peut caster en 'delegate', puis en 'System.Delegate' automatiquement... enfin bref

    Je passe la discussion en résolue ^_^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] vb.net 2010 express incompatible avec windows8
    Par zylix dans le forum VB.NET
    Réponses: 5
    Dernier message: 26/08/2013, 10h28
  2. Faire un Not In avec une Lambda expression
    Par CUCARACHA dans le forum Linq
    Réponses: 7
    Dernier message: 23/05/2011, 08h59
  3. Réponses: 3
    Dernier message: 22/10/2008, 14h50
  4. [Lambda]Problèmes avec les lambdas expressions
    Par sarapis dans le forum Général Dotnet
    Réponses: 8
    Dernier message: 25/06/2008, 13h53
  5. Réponses: 10
    Dernier message: 19/07/2007, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo