2010-11-05 5 views
13

Quiero restringir los tipos posibles que N puede asumir usando una restricción. Deseo restringir N para que sea un int o un decimal.¿Cómo restringir T a los tipos de valores usando una restricción?

public static Chart PopulateInto<T, N>(List<T> yAxis, List<N> xAxis) where N : int, decimal 
{ 
    // Do stuff here 
} 

Cualquier ayuda apreciada ...

+1

Si esos son los dos únicos tipos que le interesan, creo que podría sobrecargar el método. Claro, son 4 sobrecargas, pero eso no es tan malo. –

Respuesta

7

¿Por qué no hacer esto:

public static Chart PopulateInto<T>(List<T> yAxis, List<int> xAxis) 
{ 
    // Do stuff here 
} 

public static Chart PopulateInto<T>(List<T> yAxis, List<decimal> xAxis) 
{ 
    // Do stuff here 
} 
+1

Lo hice originalmente, pero estoy esperando algo kewler –

+10

imo, evitar 'kewl' y seguir con legible/correcto. – Marc

+0

Y mis genéricos están apagados, eso es lo que obtengo al escribir respuestas el viernes a la noche, déjenme corregir eso. –

13

No es posible restringir un parámetro genérico para un tipo de valor específica.

Sin embargo, puede forzar que sea un tipo de valor struct o mediante la adición de where N : struct, pero eso es todo.

+1

Una forma alternativa de manejarlo es tener sobrecargas específicas para las listas 'int' o' decimal'. –

6

No hay manera de hacer esto con una restricción. Sin embargo, otro enfoque, suponiendo que PopulateInto puede trabajar con un N genérico, es hacer que el núcleo del algoritmo sea genérico y privado y ofrecer 2 sobrecargas públicas que toman un int y decimal respectivamente. Esto creará un efecto similar

public static Chart PopulateInto<T>(
    List<T> yAxis, 
    List<decimal> xAxis) { 

    return PopulateIntoCore(yAxis, xAxis); 
} 

public static Chart PopulateInto<T>(
    List<T> yAxis, 
    List<int> xAxis) { 

    return PopulateIntoCore(yAxis, xAxis); 
} 

private static Chart PopulateIntoCore<T, N>(
    List<T> yAxis, 
    List<N> xAxis) where N : struct { 
    ... 
} 
+0

Los dos primeros deben ser públicos, ¿correcto? ;-) –

+1

@ Mark, sí, ese sería el quid de mi respuesta;) Corregido – JaredPar

2

Como dijo Pieter, no se puede usar una verificación en tiempo de compilación para esto. Sin embargo, puede hacer lo siguiente en el tiempo de ejecución:

if(!(typeof(N).equals(typeof(int32))) && !(typeof(N).equals(typeof(decimal)))) 
    // do something 
+1

Sí, ¿por qué no? Lanza una InvalidOperationException. –

Cuestiones relacionadas