В выпускной версии Visual Studio 2010 я думаю, что есть разница в расширении "Интерфейс реализации" по сравнению с VS2008
Если я укажу интерфейс и реализую его в классе следующим образом:
public interface IRepository<T> where T : IModel
{
T Get<T>(int id);
void Update<T>(T item);
int Add<T>(T item);
}
public class MockRepository : IRepository<MockUser>
{
// ...
}
Затем используйте расширение "Implement Interface" и получите это:
public class MockRepository : IRepository<MockUser>
{
public T Get<T>(int id)
{
throw new NotImplementedException();
}
public void Update<T>(T item)
{
throw new NotImplementedException();
}
public int Add<T>(T item)
{
throw new NotImplementedException();
}
}
Вместо того, что я ожидал
public class MockRepository : IRepository<MockUser>
{
public MockUser Get<MockUser>(int id)
{
throw new NotImplementedException();
}
public void Update<MockUser>(MockUser item)
{
throw new NotImplementedException();
}
public int Add<MockUser>(MockUser item)
{
throw new NotImplementedException();
}
}
В среде IDE используется имя переменной типа из определения общего интерфейса T
вместо указанного конкретного типа MockUser
.
Это ошибка? Или что-то новое только для VS2010 / .Net 4.0?
Обновление:
Это НЕ ошибка, я не указал интерфейс, как я предполагал, он должен быть определен как:
public interface IRepository<T> where T : IModel
{
T Get(int id);
void Update(T item);
int Add(T item);
}
другими словами, мне не нужно было указывать параметр Type T
на уровне интерфейса и метода, а только на интерфейсе.