2010-09-10 2 views
15

Dans le cas suivantGenerics Avertissement T a le même nom que le type d'un autre type

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

Je reçois l'avertissement suivant

paramètre de type « T » a le même nom comme paramètre de type de le type externe « Services.IService »

Je ne suis pas sûr de ce que le problème est avec cela, pourquoi est-il si les soins mon type de retour est le même que celui que je dis à la classe. Est-ce que j'ai râté quelque chose?

Répondre

25

Vous pouvez omettre le T dans la déclaration des méthodes Get. Vous n'introduisez pas de nouveau paramètre de type pour la méthode Get, ce que < T indique. Le fait que vous renvoyez un T est suffisant.

Je pense que cela va fonctionner:

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

Vous pouvez créer une méthode générique dans les deux classes génériques et non génériques.

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

Vous pouvez également le faire dans une classe générique, mais sur un type différent.

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

Vous voudriez ceci:

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

Fondamentalement en vous êtes le code que vous essayez de définir Get<T>(). Lorsque vous mettez cette définition générique, vous dites que c'est spécifique à cette méthode, pas toute la classe.