Недавно я добавил интерфейс к некоторым пользовательским элементам управления, которые я реализовал. Интерфейс довольно простой. Он имеет один метод, который поддерживает формирования цепочки:Проблема с дженериками, интерфейсами и литьем
Public Interface IMyInterface(Of T As WebControl)
Function DoSomething() As T
End Interface
Реализации также является довольно простым:
Public Class MyCustomControl
Inherits CompositeControl
Implements IMyInterface(Of MyCustomControl)
Public Function DoSomething() As MyCustomControl _
Implements IMyInterface(Of MyCustomControl).DoSomething
' do stuff
Return Me
End Class
Все отлично работает на эту точку. Проблемы возникают при попытке перебрать коллекцию элементов управления, которые все реализуют интерфейс IMyInterface
, например, так:
Dim myList = New List(Of IMyInterface(Of WebControl))
myList.Add(someCustomControl)
myList.ForEach(Sub(i) i.DoSomething())
someCustomControl
является MyCustomControl
, который реализует IMyInterface(Of MyCustomControl)
вместо IMyInterface(Of WebControl)
.
Я получаю эту ошибку на второй линии (где я пытаюсь добавить someCustomControl
):
Option Strict On запрещает неявные преобразования из 'MyCustomControl' до 'IMyInterface (Of WebControl).
Есть ли способ обойти эту ошибку? Я близок к тому, что он работает, но я не знаю достаточно о дженериках, чтобы выйти за пределы этого момента.
В то время как вы пытаетесь объявить myList как 'Dim myList = New List (Of IMyInterface (Of WebControl)), попробуйте' Dim myList = Новый список (Of Object) 'или что-то в этом роде. – Vishal
@Vishal Я думаю, что без типа 'IMyInterface' вы не могли бы вызывать' DoSomething() 'для объектов в цикле' ForEach'. – jbabey
Извините, я этого не знал. – Vishal