c#泛型类和方法的行为不符合预期

时间:2013-09-26 11:17:37

标签: c# generics

我有以下代码

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参数。我做错了什么?

3 个答案:

答案 0 :(得分:9)

从您在类

中声明它的方法中删除<T>
public class BaseDataRepository<T> : IDataRepository, IDisposable where T:class
{
    public IQueryable<T> GetItems()
    {
        return _context.Set<T>();
    }
}
方法中的

T由以下参数推断:

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

// so you can call

DoSomething(new object()); // T is object

答案 1 :(得分:1)

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

答案 2 :(得分: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>();
}