2011-11-17 15 views
11

Quando si tenta di chiamare questa funzione nel mio codice ottengo l'errore nel titolo. Anche l'operatore '+ =' non può essere applicato a operandi di tipo 'int' e 'T'Impossibile convertire implicitamente il tipo 'T' in '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; 
    } 

chiamo la funzione utilizzando:

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

Qual è lo scopo di rendere questo metodo generico se non è generico? – dlev

+0

quindi convertirlo in modo esplicito? –

+3

Quanto sei sicuro che Bobby Tables non distrugga il tuo database? –

risposta

9

si può provare a lanciare il valore come questo ...

t += (int)value; 

o

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

Cosa devi importare per usare 'Converti'? –

+1

'(int) value' non funzionerà. Fornirà l'errore "Impossibile convertire il tipo 'T' in 'int'" –

5

È possibile impostare vincolo:

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

Poi:

var intValue = value.ToInt32(); 
1

E kn non sa come aggiungere il tuo T a un valore numerico poiché non sa quale sarà il tipo di T.

t += Convert.ToInt32(value); 

Ma dal momento che si sta aggiungendo int a int e tornando int allora perché non solo fosso il parametro generico e renderlo

public int Change(Stats type, int value) 

e se si vuole un comportamento diverso per i diversi tipi e davvero vogliono la stessa nome del metodo, invece di testare il tipo basta fare:

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

Perché potrei passare un int, un bool, una stringa. Tutto varia quando ho bisogno di Change(); –

+0

@David, il suggerimento è valido. Finora, ci hai mostrato la logica personalizzata che desideri eseguire per un intero. Per lo meno, si potrebbe considerare di avere 'Change (Stats type, int value) 'e' Change (Stats type, T value) 'overload. I generici sono utili quando i tipi non contano per l'operazione. Ci hai mostrato un'istanza in cui il tipo * ha * importanza. –

+0

Si sta solo utilizzando il tipo generico per definire i metodi logica/flusso, si può anche creare qualche sovraccarico, almeno si otterrà un controllo del compilatore che non si è superato in un tipo che non è valido, non si potrà fare affidamento sul tipo generico vincoli per questo se lo stai aprendo a tutti i tipi che menzioni. –

0

L'errore che stai ge tting fa sence. Mentre tu chiama il il metodo con int come tipo, il compilatore non sa che sarà il caso.

Per compilare il metodo così com'è, il compilatore dovrà dimostrare che le operazioni eseguite su T saranno valide per tutti i T - il che non è chiaramente il caso.

2

Oppure un altro modo (non il cast di oggetti è necessario errore di battitura)

t += (int)(object)value;

Oppure usa la dinamica, usando la dinamica puoi fare di più, come le conversioni implicite

Oppure utilizzare Int32 - Int32 e int sono entrambi strutturati internamente. Nessuna perdita di prestazioni

+0

Non sono sicuro se sia una buona idea aggiungere trasformazioni di boxe/unboxing a funzioni generiche che utilizzano un numero intero esplicitamente .. – Jviaches

Problemi correlati