Tengo una clase de colección con un método Equals que quiero pasar en un método para hacer la comprobación de igualdad entre cada elemento. Por otra parte, quiero permitir que el tipo de delegado para operar en superclases de T, así como T en sí:¿Puedo especificar una relación de "supertipo" en las restricciones genéricas de 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
}
}
Por desgracia, el compilador Borks sobre esto ('Collection.Equals()' no define parámetro de tipo 'T '). ¿Hay alguna forma de especificar este tipo de restricción/operación?
¿Tiene sentido que sea posible? No sería posible hacerlo por inferencia porque las dos declaraciones pueden distribuirse en todo el proyecto, o incluso no especificarse – Dykam
Sí, tiene perfecto sentido: puede especificar que un parámetro de tipo debe ser una * subclase * de otra cosa, ¿por qué no al revés? (Java lo permite, usando 'T super Foo' en lugar de' T extiende Foo', por cierto.) –
Ah - Veo que estabas editando tu respuesta para poner lo que estaba escribiendo como piloto :) – ShuggyCoUk