1

我正在阅读 subsonic 3 的源代码。在文件 IRepository.cs 中我发现以下内容:

public interface IRepository<T>
{
    IQueryable<T> GetAll();
    PagedList<T> GetPaged<TKey>(Func<T, TKey> orderBy, int pageIndex, int pageSize);
     ...many other lines
    bool Load<T>(T item, Expression<Func<T, bool>> expression) where T : class, new();
    bool Load<T>(T item, string column, object value) where T : class, new();
}

请注意,Load 方法被定义为泛型,并且它们的泛型类型名称与接口的泛型类型相同,这会导致编译器警告。

我的问题是: Load 方法真的是通用的还是错误的?如果这些方法是通用的,我们是否应该将类型名称从“T”更改为“E”之类的不同名称以使编译器满意?

4

3 回答 3

1

它们不应该是不同的- Load 应该适用于 repos “类型”,因此您可以删除那里的定义(我假设这就是您正在做的事情)

于 2009-07-16T07:27:18.640 回答
0

与类级别的 T 不同,它们有约束,所以我猜它们应该是不同的。

于 2009-07-16T06:52:59.270 回答
0

在我看来,classandnew约束应该在类级别 - 而不是方法级别。

否则,是的 - 你刚刚定义了 2 个不同的 T 约束,这简直令人困惑,因为我可以这样做:

IRepository<int> intRepository = new RepositoryImpl<int>(); 

object o;
intRepository.Load<string>(o, "column", "value");

有一个IRepository<int> Load<string>对我来说似乎很奇怪。

可能T 只能是方法的和class,而不是其他方法。在这种情况下,您可能需要以下内容:newLoad

interface IRepository<T> {
   IQueryable<T> GetAll();
   bool Load<TClass>(TClass item, string column, object value) where TClass : class, T, new();
}

这不完全相同,因为TClass可以继承T- 但这是我能想到的产生该结果的最接近的约束。

于 2009-07-16T20:06:25.873 回答