5

Básicamente he lo siguiente:limitaciones genéricas - no estoy seguro de cómo solucionar esta situación con una cualquiera/o el caso

public static bool IsBetween<T>(this T value, T a, T b) 
    where T : IComparable 
{ 
    ... 
} 

public static bool IsBetween<T>(this T value, T a, T b) 
    where T : IComparable<T> 
{ 
    ... 
} 

El problema es que no puedo hacer esto porque no se puede tener un miembro con la misma firma, incluso si las restricciones son diferentes. Sin embargo, no hay forma de indicar que la restricción sea IComparable O IComparable<T>. Por lo tanto, no estoy seguro de qué hacer aquí fuera de solo escoger uno y seguir con ello. Y, no importa cuál escoja, estoy perdiendo por el otro porque están separados y no heredan el uno del otro (lo cual tiene sentido).

Me falta algo aquí, ¿hay alguna manera de lograr el uso de ambos, o voy a tener que elegir uno (probablemente la versión genérica)?

Respuesta

8

No entiendo por qué el primer método es genérico en absoluto. ¿Por qué no es justo:

public static bool IsBetween(this IComparable value, IComparable left, IComparable right) 

¿Qué valor tiene hacer que el método genérico se agregue? Obviamente, no vas a evitar la penalización de boxeo porque los valores se guardarán en cajas cuando llames al CompareTo(object).

A menos que tenga algún motivo convincente para que el método sea genérico, no lo haga genérico. Luego tiene una firma diferente del otro método, y su problema está resuelto.

+0

Nunca pensé en eso de esa manera. Supongo que fue porque empecé con la versión genérica, luego la copié/pegué e intenté hacer un cambio rápido. –

+0

Además, ¿seleccionará esto por defecto la opción 'IComparable ' y luego la opción 'IComparable'? –

+1

@ m-y: la resolución de sobrecarga elegirá el método * más específico *. Si no hay forma de determinar cuál es más específico, obtendrá un error de ambigüedad. –

3

En la sobrecarga de resolución de métodos .NET no se tienen en cuenta los tipos de devolución y las restricciones genéricas. Entonces, incluso si IComparable y IComparable<T> tuvieran algo en común que todavía no funcionara. Simplemente elija la versión IComparable<T>. Los tipos .NET estándar como Int32, Decimal, DateTime, ... implementan ambas interfaces de todos modos.

+0

Eso es lo que pensé, pero quería asegurarme de que no me faltaba algo aquí. Voy a terminar yendo con la versión genérica. Solo esperaba que mi método estuviera disponible para otro código que implemente solo 'IComparable' y no ambos (o simplemente' IComparable '). –

Cuestiones relacionadas