2010-09-10 13 views
15

Dada la siguienteGenéricos de advertencia T tiene mismo nombre que el tipo de otro tipo

public class Service<T> : IService<T> 
{ 
     Repository<T> _repository = new Repository<T>(); 
     public T Get<T>(int id) 
     { 
      return _repository.Get<T>(id); 
     } 
} 
public interface IService<T> 
{ 
     T Get<T>(int id); 
} 

me sale el siguiente aviso

parámetro tipo 'T' tiene el mismo nombre como el parámetro de tipo de tipo externo 'Services.IService'

No estoy seguro de cuál es el problema con esto, ¿por qué le importa si mi tipo de devolución es igual al tipo que le estoy diciendo a la clase. ¿Me estoy perdiendo de algo?

Respuesta

25

Puede omitir el <T> en la declaración de Obtener métodos. No está presentando un nuevo parámetro de tipo para el método Get que <T> dice. El hecho de que devuelva T es suficiente.

creo que esto va a funcionar:

public class Service<T> : IService<T> 
{ 
    Repository<T> _repository = new Repository<T>(); 
    public T Get(int id) 
    { 
     return _repository.Get(id); 
    } 
} 
public interface IService<T> 
{ 
    T Get(int id); 
} 

Se puede crear un método genérico en ambas clases genéricas y no genéricas.

public class Foo 
{ 
    public T Get<T>(int a) 
    { 
    } 
} 

También podría hacer esto en una clase genérica, pero en un tipo diferente.

public class Foo<T> 
{ 
    public S Get<S>(int a) 
    { 
    } 
} 
8

Lo que quiere esto en su lugar:

public class Service<T> : IService<T> 
{ 
     Repository<T> _repository = new Repository<T>(); 
     public T Get(int id) 
     { 
      return _repository.Get<T>(id); 
     } 
} 

public interface IService<T> 
{ 
     T Get(int id); 
} 

Básicamente estás en código que está tratando de definir Get<T>(). Cuando pones esa definición genérica, dices que es específico de ese método, no de toda la clase.

Cuestiones relacionadas