Когда у меня есть переменная ICollection<T>
в C#, я не могу передать его в функцию, которая ожидает IReadOnlyCollection<T>
:Как превратить ICollection <T> в IReadOnlyCollection <T>?
public void Foo()
{
ICollection<int> data = new List<int>();
// Bar(data); // Not allowed: Cannot implicitly cast ICollection<int> to IReadOnlyCollection<int>
Bar(data.ToList()); // Works, since List<T> implements IReadOnlyCollection<T>
}
public void Bar(IReadOnlyCollection<int> data)
{
if (data.Count == 1) { /* ... */ }
// ...
}
Видимо, проблема в том, что ICollection<T>
не наследует от IReadOnlyCollection<T>
- но почему? ICollection<T>
должен быть полным функциональным набором IReadOnlyCollection<T>
плюс функции, которые изменяют коллекцию.
И что является лучшим решением для передачи аргументов?
С одной стороны, поскольку я не хочу изменять коллекцию в Bar
, и вам просто нужно подсчитать и перебрать коллекцию, я бы хотел потребовать IReadOnlyCollection
.
С другой стороны, я не хочу создавать новый объект списка каждый раз, когда я вызываю эту функцию.
Что именно вы делаете с коллекцией в этом методе? Просто проверить счет? Вероятно, есть лучший способ справиться с этой ситуацией. –
Вы действительно используете ReadOnlyCollection, когда не хотите, чтобы что-то вне вашего класса изменяло вашу коллекцию. Если это не является публичной собственностью, проблема становится тривиальной. – Xcalibur37
@ M.kazemAkhgary Это просто перерыв во время выполнения, если кто-то передает «ICollection», который не является «IReadOnlyCollection». – Servy