1

我有以下代码

public class BaseDataRepository<T> : IDataRepository, IDisposable where T:class
    {
        public IQueryable<T> GetItems<T>() where T : class
        {
            return _context.Set<T>();
        }
    }
}

使用了以下方式

using (var repository = new BaseDataRepository<DbInterestGroupCategory>())
{
    Assert.IsTrue(repository.GetItems().Count() == 3);
}   

但我收到以下消息

无法从用法中推断出方法“...”的类型参数。尝试明确指定类型参数。

我原以为该方法会自动从类泛型类型中推断出它的 T 参数。我究竟做错了什么?

4

3 回答 3

9

<T>从您已经在类中声明的方法中删除

public class BaseDataRepository<T> : IDataRepository, IDisposable where T:class
{
    public IQueryable<T> GetItems()
    {
        return _context.Set<T>();
    }
}

Tin 方法由如下参数推断:

public void DoSomething<T>(T argument) // infer T from argument
{
}

// so you can call

DoSomething(new object()); // T is object
于 2013-09-26T11:19:34.517 回答
1

通过声明一个方法GetItems<T>,您正在创建一个不同的新“T”模板变量。去掉它。

于 2013-09-26T11:21:15.467 回答
0

您正在方法级别上重新声明泛型参数(它已经在类级别上定义),因此您现在在泛型类中有一个(独立的)泛型方法。即你可以这样写代码:

//DbInterestGroupCategory is the class-level T
var repository = new BaseDataRepository<DbInterestGroupCategory>(); 
//string is the method level T
repository.GetItems<string>();

你所做的基本上类似于

public class MyClass 
{
  public string Name {get; set;}

  public string Method()
  {
    string Name; // hides the class level property
    ....
  }
}

你需要的是一个相对于类来说不是泛型的方法,因为它没有引入任何泛型参数,它只是使用类中已经定义的那些,所以正确的语法是:

public IQueryable<T> GetItems()
{
  return _context.Set<T>();
}
于 2013-09-26T11:26:24.110 回答