2011-12-19 10 views
7

Me trataron de especificar este genérico, pero estoy recibiendo múltiples errores:Cómo especificar un genérico con un ¿dónde?

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

Por ejemplo, el ":" justo después de la V en la primera línea da un error:

Error 3 ; expected 

además de otros errores :

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 

¿Hay algo obviamente malo con mi codificación genérica?

Actualización:

hice cambios y el código ahora se ve así:

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

Llamando desde la clase derivada:

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

Usted debe probablemente'enviar; '' aquí en vez de tiro ex; '. De lo contrario, arrojarás el rastro original de la pila. –

Respuesta

12

necesita una segunda where de V:

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

Cada where enumera las restricciones para un solo tipo de parámetro. Tenga en cuenta que también he agregado los parámetros de tipo al método; de lo contrario, el compilador buscaría T y V como tipos normales, y no entendería por qué estaba tratando de restringirlos.

+0

Gracias Jon. Esto es muy diferente de un método que me sugirieron. Voy a probarlo ahora. –

+0

Ahora he bajado de 8 errores a un error que apunta a "V.AddOrUpdate (elemento)" y digo: Error 'V' es un 'parámetro de tipo', que no es válido en el contexto dado –

+0

@SamanthaJ: Correcto, y ahí es donde la respuesta de Jamiec es apropiada ... a menos que estuvieras tratando de llamar a un método * estático * como ese, que simplemente no funciona. –

5

Algunas cosas parecen incorrectas.

1) Como dijo @ Jon, es necesario separar where cláusulas

2) Es necesario definir los fármacos genéricos en el método:

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

3) Usted está tratando de llamar a un método en el tipo V no la instancia de este tipo repo. es decir, esto:

V.AddOrUpdate(item); 

debe ser

repo.AddOrUpdate(item); 
Cuestiones relacionadas