我创建了两个扩展方法:在IEnumberable<T>
上运行的 FilterAnyType 和在IEnumerable<Movie>
上运行的 FilterMovieType :
public static IEnumerable<T> FilterAnyType<T>(this IEnumerable<T> source, Func<T,bool> predicate)
{
//code goes here
}
public static IEnumerable<Movie> FilterMovieType<Movie>(this IEnumerable<Movie> source, Func<Movie, bool> predicate)
{
//code goes here
}
然后,我创建了两个不同的列表:
var movies = new List<Movie>();
var customers = new List<Customer>();
如预期的那样,FilterAnyType
和movie
的两个实例都可以使用customers
方法。但是,FilterMovieType
实例也可以使用方法customer
,但我没想到。
我正在学习扩展方法(因此有这种做法),据我了解,它是使用this
关键字来标识扩展方法将被“添加”到的对象的类型。
鉴于此,我希望FilterMovieType
仅对IEnumerable<Movie>
的实例可用。为什么IEnumerable<Customer>
也可以使用它?
谢谢!
答案 0 :(得分:10)
您的第二种方法仍然是通用的,只有您将参数命名为Movie
,而不是T
。在FilterMovieType
上定义的Movie与实际的Movie类无关,它只是一个占位符。
要解决此问题,请在方法名称后删除<Movie>
,即:
public static IEnumerable<Movie> FilterMovieType(this IEnumerable<Movie> source, Func<Movie, bool> predicate)
{
//code goes here
}