Мне нужно использовать IReadOnlyList<T>
в качестве возвращаемого параметра, поскольку он наилучшим образом соответствует моим потребностям, но, как вы можете видеть из приведенных ниже примеров, вы все равно можете изменить список, который он переносит, если он не предназначен только для чтения.
using System.Collections.Generic;
using System.Collections.Immutable;
public class Test
{
public Test()
{
// return an IReadOnlyList that wraps a List, we can modify content
var list1 = GetList1();
if (list1 is List<Section> sections1) // can be true
{
sections1.Clear();
}
// return an IReadOnlyList that wraps an ImmutableArray, we cannot modify content
var list2 = GetList2();
if (list2 is List<Section> sections2) // never true
{
sections2.Clear();
}
}
public static IReadOnlyList<Section> GetList1()
{
return new List<Section> {new Section()};
}
public static IReadOnlyList<Section> GetList2()
{
return ImmutableArray.Create(new Section());
}
}
public struct Section
{
}
Проблема:
ImmutableArray<T>
выглядит великолепно, поскольку она действительно только для чтения, единственное, что я не хочу / не нужно публично возвращать это полнофункциональный класс , позволяющий вносить изменения, создающие копию.
Поэтому я стараюсь вернуть IReadOnlyList<T>
, поскольку его намерения просты, но мне нужно исправить проблему с изменяемым списком.
Вопрос:
Возвращает ImmutableArray<T>
как IReadOnlyList<T>
- это правильный подход?
Если нет, то можете ли вы подсказать, как это сделать?