2011-12-19 9 views
7

Ho cercato di specificare questo generico, ma sto ottenendo più errori:Come specificare un generico con un dove?

public void AddOrUpdate(T item, V repo) where T: IAuditableTable, V: IAzureTable<TableServiceEntity> 
    { 
     try 
     { 
      V.AddOrUpdate(item); 
     } 
     catch (Exception ex) 
     { 
      _ex.Errors.Add("", "Error when adding account"); 
      throw _ex; 
     } 
    } 

Ad esempio, il ":" solo dopo la V sulla prima linea dà un errore:

Error 3 ; expected 

più altri errori :

Error 2 Constraints are not allowed on non-generic declarations 
Error 6 Invalid token ')' in class, struct, or interface member declaration 
Error 5 Invalid token '(' in class, struct, or interface member declaration 
Error 7 A namespace cannot directly contain members such as fields or methods 
Error 8 Type or namespace definition, or end-of-file expected 

C'è qualcosa che ovviamente non va nel mio codice generico?

Aggiornamento:

ho fatto cambiamenti e al codice appare come segue:

public void AddOrUpdate<T, V>(T item, V repo) 
     where T : Microsoft.WindowsAzure.StorageClient.TableServiceEntity 
     where V : IAzureTable<TableServiceEntity> 
    { 
     try 
     { 
      repo.AddOrUpdate(item); 
     } 
     catch (Exception ex) 
     { 
      _ex.Errors.Add("", "Error when adding account"); 
      throw _ex; 
     } 
    } 

chiamata dalla classe derivata:

public void AddOrUpdate(Account account) 
    { 
     base.AddOrUpdate<Account, IAzureTable<Account>>(account, _accountRepository); 
    } 
+6

Probabilmente si dovrebbe gettare ';' qui piuttosto che 'due ex;'. Altrimenti getterai la traccia dello stack originale. –

risposta

12

Hai bisogno di un secondo where per V:

public void AddOrUpdate<T, V>(T item, V repo) 
    where T : IAuditableTable 
    where V : IAzureTable<TableServiceEntity> 

Ogni where elenca i vincoli per un singolo parametro di tipo. Nota che ho aggiunto anche i parametri del tipo al metodo - altrimenti il ​​compilatore cercherebbe T e V come tipi normali e non capirebbe perché stavi cercando di vincolarli.

+0

Grazie Jon. Questo è molto diverso da un metodo suggerito a me. Lo proverò ora. –

+0

Sono ora passato da 8 errori a un solo errore che punta a "V.AddOrUpdate (item)" e dicendo: Errore 'V' è un 'parametro di tipo', che non è valido nel contesto dato –

+0

@SamanthaJ: Esatto, ed è qui che la risposta di Jamiec è appropriata ... a meno che non stiate provando a chiamare un metodo * statico * come quello, che semplicemente non funziona. –

5

Alcune cose sembrano sbagliate.

1) Come ha detto @ Jon, è necessario separati where clausole

2) È necessario definire i farmaci generici sul metodo:

public void AddOrUpdate<T,V>(T item, V repo) where .... 

3) Si sta tentando di chiamare un metodo sul digitare V non l'istanza di questo tipo repo. vale a dire, in questo modo:

V.AddOrUpdate(item); 

dovrebbe essere

repo.AddOrUpdate(item); 
Problemi correlati