Я думаю, что вы, вероятно, хотите переопределить свой интерфейс следующим образом:
public interface IOurTemplate<T, U>
where T : class
where U : class
{
IEnumerable<T> List();
T Get(U id);
}
Я думаю, вы хотите, чтобы методы использовали (повторно использовали) универсальные параметры универсального интерфейса, в котором они объявлены; и что вы, вероятно, не хотите делать их универсальными методами с их собственными (отличными от интерфейса) общими параметрами.
Учитывая интерфейс, как я его переопределил, вы можете определить класс следующим образом:
class Foo : IOurTemplate<Bar, Baz>
{
public IEnumerable<Bar> List() { ... etc... }
public Bar Get(Baz id) { ... etc... }
}
Или определите общий класс следующим образом:
class Foo<T, U> : IOurTemplate<T, U>
where T : class
where U : class
{
public IEnumerable<T> List() { ... etc... }
public T Get(U id) { ... etc... }
}