Metodi Generici per operazioni

di il
7 risposte

Metodi Generici per operazioni

Buongiorno a tutti, innanzitutto mi scuso se uso termini non appropriati o se sbaglio qualche passaggio.
Stavo approfondendo un pò le classi generiche quando ho constatato che non posso compiere operazioni(somma,moltiplicazione) tra operandi di tipo generici. Ovviamente questo è dovuto dal fatto che il compilatore non sa a priori se quella operazione è possibile oppure no.
Quindi mi chiedevo se esistono delle soluzioni, ho cercato in rete ed ho trovato solo alcuni esempi che vi allego di seguito.
Primo caso in cui ricevo l'errore:

T metodo<T>(T a,T b)
    {
        return a *b;
    }
Secondo caso che mi evita di ricevere l'errore:

T metodo<T>(dynamic a,dynamic b)
     {
         return a *b;
     }
Oppure:

T metodo<T>(T a,T b)
     {
         dynamic aa=a, bb=b;
         return aa *ba;
     }
Le mie domande sono queste:
1)Ha senso usare i Generic quando si devono compiere queste operazioni?
2)Se si, i due esempi mostrati sono giusti o fanno perdere l'essenza dei generic?
3)Sempre se gli esempi sono corretti, quali dei due mi consigliate?
4)Ho visto che si può utilizzare anche la clausola where, ma non ne ho trovata una che mi permettesse di compiere operazioni. Sono io che sbaglio?
Grazie mille a ttui

7 Risposte

  • Re: Metodi Generici per operazioni

    Non e' per nulla chiaro quello che hai scritto.

    Iniziamo con una cosa BANALE:

    C# PREVEDE l'overloading degli operatori!

    https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/operator-overloading
    https://www.c-sharpcorner.com/article/operator-overloading-in-C-Sharp2/

    'dynamic' ORRENDO.

    Non sa da fare ne domani ne mai

    Come disse qualcuno
  • Re: Metodi Generici per operazioni

    iacofr ha scritto:


    1)Ha senso usare i Generic quando si devono compiere queste operazioni?
    I Generics si usano quando è possibile lasciare un "segnaposto" per un tipo che puoi indicare in seguito.

    L'overload o meno degli operatori dipende dal tipo specifico. Nulla ti vieta di mettere un "constraint" sul parametro generico che preveda la possibilità di specificare una classe o un tipo per il quale sono stati ridefiniti degli operatori, ma le due cose sono scollegate.

    iacofr ha scritto:


    2)Se si, i due esempi mostrati sono giusti o fanno perdere l'essenza dei generic?
    3)Sempre se gli esempi sono corretti, quali dei due mi consigliate?
    Gli esempi mostrati non hanno molto senso: stai probabilmente confondendo e "fondendo" due cose distinte.

    iacofr ha scritto:


    4)Ho visto che si può utilizzare anche la clausola where, ma non ne ho trovata una che mi permettesse di compiere operazioni. Sono io che sbaglio?
    Io guarderei di nuovo la documentazione e cercherei di chiarirmi le idee sulla differenza tra Generics da un lato e Operator Overloading dall'altro.

    Ciao!
  • Re: Metodi Generici per operazioni

    migliorabile ha scritto:




    'dynamic' ORRENDO.
    Perchè è orrendo? Puoi spiegarne i motivi? Grazie

    Alka ha scritto:


    iacofr ha scritto:


    1)Ha senso usare i Generic quando si devono compiere queste operazioni?
    I Generics si usano quando è possibile lasciare un "segnaposto" per un tipo che puoi indicare in seguito.

    L'overload o meno degli operatori dipende dal tipo specifico. Nulla ti vieta di mettere un "constraint" sul parametro generico che preveda la possibilità di specificare una classe o un tipo per il quale sono stati ridefiniti degli operatori, ma le due cose sono scollegate.

    iacofr ha scritto:


    2)Se si, i due esempi mostrati sono giusti o fanno perdere l'essenza dei generic?
    3)Sempre se gli esempi sono corretti, quali dei due mi consigliate?
    Gli esempi mostrati non hanno molto senso: stai probabilmente confondendo e "fondendo" due cose distinte.

    iacofr ha scritto:


    4)Ho visto che si può utilizzare anche la clausola where, ma non ne ho trovata una che mi permettesse di compiere operazioni. Sono io che sbaglio?
    Io guarderei di nuovo la documentazione e cercherei di chiarirmi le idee sulla differenza tra Generics da un lato e Operator Overloading dall'altro.

    Ciao!
    Io il problema delle operazioni l ho avuto con i generic, ed ho collegato le due cose. Quindi a questo punto ti chiedo...è corretto usare l'overload degli operatori in questa circostanza? Grazie
  • Re: Metodi Generici per operazioni

    C# e' un linguaggio tipizzato.

    dynamic e' un modo accrocchioso per convincere C# a funzionare come un linguaggio NON tipizzato, la cui cosa e' da evitare come la lebbra per un SACCO di motivi che non sto qui' a spiegare perche' la trovi in QUALUNQUE posto dove si confrontano i linguaggi tipizzati con quelli NON tipizzati.

    ESISTONO casi in cui 'sa da fare', e si fa, MA (ed e' un MA GIGANTESCO) si ha BEN CHIARO PERCHE' lo si fa.
    Ed anche in questi casi ci sono modi migliori per affrontare il problema (ci sono SEMPRE).
  • Re: Metodi Generici per operazioni

    migliorabile ha scritto:


    C# e' un linguaggio tipizzato.

    dynamic e' un modo accrocchioso per convincere C# a funzionare come un linguaggio NON tipizzato, la cui cosa e' da evitare come la lebbra per un SACCO di motivi che non sto qui' a spiegare perche' la trovi in QUALUNQUE posto dove si confrontano i linguaggi tipizzati con quelli NON tipizzati.

    ESISTONO casi in cui 'sa da fare', e si fa, MA (ed e' un MA GIGANTESCO) si ha BEN CHIARO PERCHE' lo si fa.
    Ed anche in questi casi ci sono modi migliori per affrontare il problema (ci sono SEMPRE).
    Ok grazie, mentre var può essere più utile in alcuni contesti?
  • Re: Metodi Generici per operazioni

    Ciao,
    VAR : si usa per la tipizzazione implicita automaticamente dedotta in fase di compilazione in base a quanto rilevato in fase di inizializzazione.
    Se ne fa un massivo uso in abbinata a LINQ.

    dynamic type : si sposta la deduzione del tipo da compile time a run time. Difatti non può supportare intelliSense in Visual Studio.
    Ti permette di fare cose del genere:
    dynamic myVal= "pippo";
    myVal = 9;
    dynamic type a differenza di VAR può essere usato per restituire valori da funzioni e usato per le proprietà di classe.

    Non piace neanche a me, mi ricorda i Variant Data-Type. Detto questo, in casistiche di nicchia può servire. Io non ne ho mai avuto necessità.
  • Re: Metodi Generici per operazioni

    Toki ha scritto:


    Ciao,
    VAR : si usa per la tipizzazione implicita automaticamente dedotta in fase di compilazione in base a quanto rilevato in fase di inizializzazione.
    Se ne fa un massivo uso in abbinata a LINQ.

    dynamic type : si sposta la deduzione del tipo da compile time a run time. Difatti non può supportare intelliSense in Visual Studio.
    Ti permette di fare cose del genere:
    dynamic myVal= "pippo";
    myVal = 9;
    dynamic type a differenza di VAR può essere usato per restituire valori da funzioni e usato per le proprietà di classe.

    Non piace neanche a me, mi ricorda i Variant Data-Type. Detto questo, in casistiche di nicchia può servire. Io non ne ho mai avuto necessità.
    Grazie mille per la spiegazione...
Devi accedere o registrarti per scrivere nel forum
7 risposte