Cuando tratando de llamar a esta función en mi código me sale el error en el título. También el Operador ‘+=’ no se puede aplicar a los operandos de tipo ‘int’ y ‘T’

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;
    }

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

Change<int>(type, 1);
¿Cuál es el punto de este método genérico si no es genérico?
para convertir explícitamente?
¿Qué tan seguro está usted de que Bobby Tablas no va a la ruina de su base de datos?
Me gustaría hacer algo acerca de su interfaz de SQL… que parece una invitación a un ataque de inyección.
Me doy cuenta de que tu «pregunta» en realidad no contiene una pregunta; por el contrario, contiene una descripción de la correcta compilador de comportamiento. ¿tienes una pregunta? Basado en el código sospecho que usted cree que C# genéricos son una especie de plantillas de C++. Ellos no lo son. Una de plantillas de C++ es compilar cada vez que construir, y por lo tanto sólo debe ser correcta para el real construcciones. A C# genérico es en realidad generic; es necesario ser correcto para cualquier posible la construcción, no las construcciones que. Un arbitrario T no puede ser añadido a un int.

OriginalEl autor David W | 2011-11-17

5 Comentarios

  1. 12

    usted puede tratar de fundición el valor como este …

    t += (int)value; 

    o

    t+= Convert.ToInt32(value);
    ¿Qué se necesita para importar a utilizar Convert?
    (int)value no funcionará. Dará error «No se puede convertir el tipo ‘T’ a ‘int’ «
    Como @yatharthvarshney ha dicho, (int) value no funcionará con value ser un tipo genérico T. Usted tiene que escribir (int) (object) value, que introduce boxing y unboxing.

    OriginalEl autor Enigma State

  2. 6

    Puede establecer restricciones:

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

    A continuación:

    var intValue = value.ToInt32();

    OriginalEl autor Kirill Polishchuk

  3. 4

    O de otra manera (objeto de fundición es necesario no errata)

    t += (int)(object)value;

    O uso dinámico, mediante el uso de dinámicas que usted puede hacer más, tales como conversiones implícitas

    O uso Int32 Int32 e int son tanto struct internamente. Sin pérdida de rendimiento

    No se si es buena idea añadir boxing/unboxing transformaciones a la función genérica que mediante integer explícitamente..

    OriginalEl autor Bamboo

  4. 1

    No sabe cómo agregar su T a una numérico puesto que no sepa cuál es el tipo de T va a ser.

    t += Convert.ToInt32(value);

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

    public int Change(Stats type, int value)  

    y si quieres un comportamiento diferente para los diferentes tipos y realmente quiero el mismo nombre de método, en lugar de probar el tipo que acabamos de hacer:

     public int Change(Stats type, string value) 
     public int Change(Stats type, DateTime value)  
    Porque me podría pasar un int, bool, una cadena. Todo varía en cuando siento la necesidad de Cambiar();
    la sugerencia es válida. Hasta ahora, nos han mostrado la lógica personalizada que desea realizar durante un entero. Al menos, usted podría considerar la posibilidad de tener Change(Stats type, int value) y Change<T>(Stats type, T value) sobrecargas. Los medicamentos genéricos son útiles cuando los tipos no importa para la operación. Nos han mostrado una instancia en donde el tipo de no de la materia.
    Sólo está utilizando el tipo genérico para definir los métodos de la lógica/flujo, puede crear algunas de las sobrecargas, por lo menos usted tendrá un compilador compruebe que he pasado en un tipo que no es válida, usted no será capaz de confiar en el tipo genérico de restricciones para que si va a abrir a todos los tipos que usted menciona.

    OriginalEl autor Richard Friend

  5. 0

    El error que usted está consiguiendo que hace sence. Mientras llamada el método con int como el tipo, el compilador no sabe que va a ser el caso.

    Para compilar el método, el compilador necesita para demostrar que las operaciones que haces en T será válida para todos los T – que evidentemente no es el caso.

    OriginalEl autor driis

Dejar respuesta

Please enter your comment!
Please enter your name here