|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
[C#] - Operator Overload su IEnumerable
Stavo cercando di arricchire la mia libreria di comandi Funzionali del C#.
A differenza del Python, non c'e' nativamente l'operatore + fra IEnumerable. Esiste solo la function estension Concat Questo permetterebbe di scrivere cose tipo ListA + ListB + ListC (e anche tutti gli altri derivati da IEnumerable di un qualsiasi tipo, compreso egli stesso) invece che ListA.Concat(ListB).Concat(ListC) Ora, mi piacerebbe dotare la libreria dell'overload dell'operator+ sui tipi generici IEnumerable<T>, ovvero tutti quelli che vengono restituiti dagli operatori del LINQ. Ci ho provato e non ci sono riuscito. Ho cercato in giro e ho trovato un paragrafo sul libro C# Cookbook che farebbe proprio al caso mio E' simile alla mia, almeno l'interfaccia Quote:
Ma perche' non riesco a compilare ne la mia ne quella del libro?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
![]() così ad occhio mi pare corretta... che errore ti dice?
__________________
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Mi dice
Quote:
Ho provato anche con le partial class ma non funziona.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
capito forse..
se guardi nell'esempio successivo nel link che hai postato si vede che implementa 3 volte l'operatore +: 1)operator + (Set<T>, Set<T>) 2)operator + (IEnumerable<T>, Set<T>) 3)operator + (Set<T>, IEnumerable<T>) ..quindi mi sa che il compilatore non accetta come parametri interfacce o classi astratte ma deve esserci almeno un parametro dello stesso tipo (concreto) in cui è definito l'overloading dell'operatore... tieni conto però che la mia è solo una supposta però, eh
__________________
|
|
|
|
|
|
#5 | |
|
Registered User
Iscritto dal: Feb 2008
Messaggi: 77
|
Quote:
Col C# 3.x puoi provare con gli "extension methods" (anche se non so se possono essere applicati agli operatori): http://visualcsharp.it/2008/02/20/c-...nsion-methods/ |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
quindi il problema non è che non può essere un'interfaccia o una classe astratta ma è solo che deve essere definito all'interno dello stesso tipo di cui sta facendo l'overloading....
__________________
|
|
|
|
|
|
|
#7 | ||
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Come quando fai l'overload di operator+ (class A, class B) all'interno di class A e poi lo rifai all'interno di class B. Quote:
Ma allora l'esempio di quel libro? Hanno scritto una bufala?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
||
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Senza incasinarsi troppo sui template.
E' possibile definire un operator overload sulla classe base stringhe? p.es: Codice:
static void string operator-(string A,string B)
{
// Codice che magari prendere tutti i caratteri di A
//a toglie i caratteri presenti in B
}
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#9 | |||
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Girando sul web ho trovato: Quote:
Quote:
Ma in che classe andavano a ridefinire l'operatore? |
|||
|
|
|
|
|
#10 |
|
Registered User
Iscritto dal: Feb 2008
Messaggi: 77
|
Non dovrebbe compilare.
Come quando fai l'overload di operator+ (class A, class B) all'interno di class A e poi lo rifai all'interno di class B.[/quote] Secondo me si sono tutelati nel caso in cui carichi dinamicamente un assembly in un AppDomain... l'assembly caricato potrebbe ridefinire un determinato operatore e questo a priori il compilatore non lo sa. |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Grazie per intanto. Mi sa proprio che non si fa.
E chi lo sa? Sembra un copia-incolla. Con le extension ci si va molto vicini Codice:
public static IEnumerable<T> Aggiungili<T>(this IEnumerable<T> p1,
IEnumerable<T> p2)
{
foreach(T t in p1) yield return t;
foreach(T t in p2) yield return t;
// O qualsiasi altra cosa
}
Codice:
public static IEnumerable<T> operator+<T>(this IEnumerable<T> p1,
IEnumerable<T> p2)
{
foreach(T t in p1) yield return t;
foreach(T t in p2) yield return t;
// O qualsiasi altra cosa
}
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#12 |
|
Registered User
Iscritto dal: Feb 2008
Messaggi: 77
|
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
Per String vale la stessa cosa. Infatti nell'esempio che hai linkato tu poi l'hanno fatto all'interno della classe Set che hanno definito loro e hanno ridefinito i 3 operatori per i vari tipi.
__________________
|
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Gia'.
Niente operator+ per tutti gli IEnumerator generici quindi. Peccato.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:17.





















