Указан метод расширения для неподдерживаемого типа. Зачем? - PullRequest
1 голос
/ 27 апреля 2019

Я создал два метода расширения: FilterAnyType , который работает на IEnumberable<T>, и FilterMovieType , который работает на IEnumerable<Movie>:

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>?

Спасибо !!

1 Ответ

10 голосов
/ 27 апреля 2019

Ваш второй метод все еще универсален, только вы назвали свой параметр Movie, а не T.Фильм, определенный в FilterMovieType, не имеет отношения к реальному классу Movie, это просто заполнитель.Чтобы исправить это, удалите <Movie> после имени метода, то есть:

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