Ho una classe di raccolta con un metodo Equals che voglio passare in un metodo per fare il controllo di uguaglianza tra ogni elemento. Inoltre, voglio permettere il tipo delegato di operare su superclassi di T, così come T stessa:Posso specificare una relazione "supertipo" nei vincoli generici C#?
public delegate bool EqualityComparer<T>(T x, T y);
public class Collection<T>
{
//...
public bool Equals<U>(Collection<T> other, EqualityComparer<U> eq) where T : U
{
// code using eq delegate to test equality between
// members of this and other collection
}
}
Purtroppo, il compilatore Borks su questo ('Collection.Equals()' non definisce parametro di tipo 'T '). C'è un modo per specificare questo tipo di vincolo/operazione?
Ha senso essere possibile? Non rendere possibile l'inferenza è difficile perché le due dichiarazioni possono essere diffuse nell'intero progetto, o anche non essere specificate – Dykam
Sì, ha perfettamente senso - è possibile specificare che un parametro di tipo deve essere una * sottoclasse * di qualcos'altro, quindi perché non il contrario? (Java permette questo, usando 'T super Foo' invece di' T estende Foo', btw.) –
Ah - Vedo che stavi modificando la tua risposta per mettere quello che stavo scrivendo come un cavaliere :) – ShuggyCoUk