2011-11-17 59 views
11

Al intentar llamar a esta función en mi código, aparece el error en el título. También operador '+ =' No se puede aplicar a los operandos de tipo 'int' y 'T'No se puede convertir implícitamente el tipo 'T' a 'Int'

public int Change<T>(Stats type, T value) 
    { 
     Dictionary<string, string> temp = new Dictionary<string, string>(); 
     temp = sql.Query(string.Format("SELECT {0} FROM player WHERE fbId='{1}'", type.ToString(), FBId)); 
     if (typeof(T) == typeof(int)) 
     { 
      int t = Convert.ToInt16(temp[type.ToString()]); 
      t += value; 
      if (t < 0) return -1; 
      PlayerStats[type] = t; 

     } 
     sql.Upload(string.Format("UPDATE player SET {0}='{1}' WHERE fbId='{2}'", type.ToString(), PlayerStats[type], FBId)); 
     return 0; 
    } 

que llame a la función mediante el uso de:

Change<int>(type, 1); 
+15

¿De qué sirve hacer que este método sea genérico si no es genérico? – dlev

+0

así que conviértalo explícitamente? –

+3

¿Qué tan seguro está de que Bobby Tables no arruine su base de datos? –

Respuesta

9

puede probar conversión del valor así ...

t += (int)value; 

o

t+= Convert.ToInt32(value); 
+0

¿Qué necesita importar para usar 'Convert'? –

+1

'(int) value' no funcionará. Le dará el error "No se puede convertir el tipo 'T' a 'int'" –

5

Puede establecer limitación:

public int Change<T>(Stats type, T value) where T : IConvertible 

continuación:

var intValue = value.ToInt32(); 
1

Se kN No se explica cómo agregar su T a un número, ya que no sabe cuál será el tipo de T.

t += Convert.ToInt32(value); 

Pero ya que está agregando int a int y volviendo int entonces ¿por qué no zanja el parámetro genérico y hacer que

public int Change(Stats type, int value) 

y si quieres un comportamiento diferente para los distintos tipos y realmente quiere que la misma nombre del método, en lugar de probar el tipo, solo haga lo siguiente:

public int Change(Stats type, string value) 
public int Change(Stats type, DateTime value) 
+0

Porque podría pasar un int, a bool, una cadena. Todo varía cuando necesito cambiar(); –

+0

@David, la sugerencia es válida. Hasta ahora, nos ha mostrado la lógica personalizada que desea realizar para un número entero. Como mínimo, podría considerar tener sobrecargas las variables 'Change (Stats type, int value)' y 'Change (Stats type, T value)'. Los genéricos son útiles cuando los tipos no importan para la operación. Nos ha mostrado una instancia en la que el tipo * importa *. –

+0

Solo está utilizando el tipo genérico para definir los métodos de lógica/flujo, también puede crear algunas sobrecargas, al menos obtendrá una verificación del compilador que no ha pasado en un tipo que no es válido, no podrá confiar en el tipo genérico limitaciones para eso si lo estás abriendo a todos los tipos que mencionas. –

0

El error que está ge tting hace sence. Mientras que llama al como el tipo de método int, el compilador no sabe que será el caso.

Para compilar el método tal como está, el compilador deberá demostrar que las operaciones que realiza en T serán válidas para todas las T, lo que claramente no es el caso.

2

O de otra forma (no objeto colado es necesario typo)

t += (int)(object)value;

O utilice la dinámica, mediante el uso dinámico puede hacer más, como los moldes implícitos

O use Int32 - Int32 e int son ambos struct internamente. Sin pérdida de rendimiento

+0

No estoy seguro de si es una buena idea agregar transformaciones de boxeo/unboxing a la función genérica que usa enteros explícitamente ... – Jviaches

Cuestiones relacionadas