Представьте, что у меня есть метод расширения, который работает с интерфейсом абстрактных объектов:
public static void BlowTheirWhoHoovers(this ICollection<Image> source)
{
...
}
Это расширение знает, как создать список пользователей в списке изображений.
Примечание
- это список изображений , который является абстрактным. До тех пор, пока списки содержат все, что происходит от Image (например,
Bitmap
, Metafile
, PngImage
), расширение может обрабатывать это
source
список может быть любым списком, если он предоставляет ICollection
- , поскольку в списке
source
потенциально могут быть добавлены или удалены элементы, это ICollection
, а не IEnumeration
(IEnumeration
не поддерживает изменение списка)
Это все хорошо, кроме того, что не работает, метод расширения не найден:
Collection<Bitmap> whoHonkers = new Collection<Bitmap>();
whoHonkers.BlowTheirWhoHoovers();
![enter image description here](https://i.stack.imgur.com/LlMRo.png)
Я предполагаю, что это не удалось, потому что:
- Visual Studio не думает,
Collection
реализует ICollection<T>
- Visual Studio не думает
Bitmap
происходит от Image
Теперь я могу изменить мой добавочный номер:
public static void BlowTheirWhoHoovers(this Collection<Bitmap> source)
{
...
}
который компилирует :
![enter image description here](https://i.stack.imgur.com/JLDIR.png)
за исключением того, что он больше не полезен (для него требуется Collection
и требуется Bitmap
), например он не работает ни на чем, кроме Collection<T>
:
List<Bitmap> whoHonkers = new List<Bitmap>();
whoHonkers.BlowTheirWhoHoovers();
Он также не работает на всем, что Bitmap
:
List<Metafile> whoHonkers = new List<Metafile>();
whoHonkers.BlowTheirWhoHoovers();
или
List<PngImage> whoHonkers = new List<PngImage>();
whoHonkers.BlowTheirWhoHoovers();
Как применить расширение ко всему, что равно :
ICollection<Image>
я не могу заставить кого-либо изменить свою декларацию, например ::1010 *
List<Bitmap>
до
Collection<Image>
Обновление
Возможные пути исследования решения:
- поиск синтаксиса, разрешающего расширения для вещей, которые компилятор должен уметь
- приведение списка вручную; выполняет за это работу компилятора
Обновление # 2
Я мог бы упростить некоторые отвлекающие факторы вокруг ICollection
и сделать это IEnumerable
(так как это гипотетический пример, я могу составить все, что захочу). Но скриншоты уже показывают Collection
, поэтому я собираюсь оставить все как есть.
Обновление № 3 :
Как указал foson , изменение его на IEnumerable
позволяет обмануть ответ. Так что это определенно должно остаться как ICollection
.