Ковариация и контравариантность C # при реализации интерфейсов

Недавно я решил освежить свою память об основах C #, так что это может быть тривиально, но я столкнулся со следующей проблемой:

StringCollection использовался в .NET v1.0 для создания строго типизированной коллекции для строк в отличие от объекта на основе ArrayList (позже он был расширен за счет включения универсальных коллекций):

Взглянув на определение StringCollection , вы увидите следующее:

// Summary:
//     Represents a collection of strings.
[Serializable]
public class StringCollection : IList, ICollection, IEnumerable
{
...
    public int Add(string value);
...
}

Вы можете увидеть, что оно реализует IList , который содержит следующее объявление (среди нескольких других объявлений):

int Add(object value);

Но нет:

int Add(string value);

Моим первым предположением было это возможно из-за правил ковариации .NET framework.

Поэтому, чтобы убедиться, я попытался написать свой собственный класс, который реализует IList и изменил

int Add(object value);

, чтобы получить строковый тип вместо тип объекта, но, к моему удивлению, при попытке скомпилировать проект я получил ошибку времени компиляции:

does not implement interface member 'System.Collections.IList.Add(object)'

Есть идеи, что вызывает это?

Спасибо!

9
задан Jalal Said 14 August 2011 в 03:06
поделиться