列出了不支持类型的扩展方法。为什么?

时间:2019-04-27 20:00:55

标签: c# .net extension-methods

我创建了两个扩展方法:在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>();

如预期的那样,FilterAnyTypemovie的两个实例都可以使用customers方法。但是,FilterMovieType实例也可以使用方法customer,但我没想到。

我正在学习扩展方法(因此有这种做法),据我了解,它是使用this关键字来标识扩展方法将被“添加”到的对象的类型。

鉴于此,我希望FilterMovieType仅对IEnumerable<Movie>的实例可用。为什么IEnumerable<Customer>也可以使用它?

谢谢!

1 个答案:

答案 0 :(得分:10)

您的第二种方法仍然是通用的,只有您将参数命名为Movie,而不是T。在FilterMovieType上定义的Movie与实际的Movie类无关,它只是一个占位符。 要解决此问题,请在方法名称后删除<Movie>,即:

public static IEnumerable<Movie> FilterMovieType(this IEnumerable<Movie> source, Func<Movie, bool> predicate)
{
     //code goes here
}