A List(Of Entity)
не является IList(Of IWeightable)
.Рассмотрим этот код (где OtherWeightable
реализует IWeightable
):
Dim list As IList(Of IWeightable) = New List(Of Entity)
list.Add(new OtherWeightable)
Вторая строка для компиляции - в этом нет ничего подозрительного - но вам не нужен элемент OtherWeightable
в List(Of Entity)
.
.NET 4 имеет частичное решение для этого в виде универсальной дисперсии .Если ваш Calculate
метод выполняет итерации только по entities
, вы можете изменить подпись следующим образом:
Public Sub Calculate(ByVal entites As IEnumerable(Of IWeightable))
Хотя IList(Of T)
является инвариантом , IEnumerable(Of T)
является ковариантный в T
, поскольку API только когда-либо позволяет значениям T
быть возвращаемыми им - в методах IEnumerable(Of T)
нет параметров типа T
.Так что есть преобразование из List(Entity)
в IEnumerable(Of IWeightable)
.
Общая дисперсия - тема волосатая - на NDC 2010 я выступил с презентацией по ней, которая может оказаться вам полезной.Вы можете посмотреть его на странице видео NDC 2010 .(Ищите «дисперсия».)
Если вы используете .NET 3.5 или более раннюю версию, предложение Конрада сделать Calculate
generic является хорошим выбором.