我有以下代码
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参数。我做错了什么?
答案 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>();
}