使用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>
{
// ...
}
然后使用“实现接口”扩展并获取:
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
,而只需在接口处指定。
答案 0 :(得分:4)
<T>
作为接口方法的类型参数没有任何意义。这没有必要,如果你删除它,你将得到预期的行为 - 除了结果是这样的:
public class MockRepository : IRepository<IModel>
{
public IModel Get(int id)
{
throw new NotImplementedException();
}
public void Update()
{
throw new NotImplementedException();
}
public int Add(IModel item)
{
throw new NotImplementedException();
}
}
通用方法类型参数与接口/类类型参数不同 - 我不希望在您的示例中使用IModel
实现它们。 (换句话说,IRepository<T>
中的T不是Get<T>
中的T。)
答案 1 :(得分:4)
它正在为你做正确的事。
您的接口的每个方法都有自己的T
参数,在方法的调用者最终指定它之前,该参数仍未指定。您的界面T
未使用。