VS2010实现通用接口扩展不使用指定类型

时间:2010-04-15 05:52:26

标签: c# generics ide visual-studio-2010 interface

使用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,而只需在接口处指定。

2 个答案:

答案 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未使用。