#c_sharp
Задали вопрос на собеседовании. Возможно ли инициализировать экземпляр класса с индексатором блоком инициализатора? class MyClass { private int[] array = new int[5]; public int this[int index] { get { return array[index]; } set { array[index] = value; } } } class Program { static void Main() { // Допустима ли чисто теоретически такая инициализация? MyClass my = new MyClass(){1,2,3,4,5}; //my[0] = 1; //my[1] = 2; //my[2] = 3; //my[3] = 4; //my[4] = 5; Console.ReadKey(); } } Если реализовать два интерфейса iEnumerable и IEnumerator: class MyClass : IEnumerable, IEnumerator { private int[] array = new int[5]; int index; // Индексатор. public int this[int index] { get // Аксессор. { return array[index]; } set // Мутатор. { array[index] = value; } } public IEnumerator GetEnumerator() { return this; } public bool MoveNext() { if(index == array.Length - 1) { Reset(); return false; } index++; return true; } public void Reset() { index = -1; } public object Current { get { return array[index]; } } } В блоке инициализатора VS на каждое число ругается: CS1061 'MyClass' does not contain a definition for 'Add' and no extension method 'Add' accepting a first argument of type 'MyClass' could be found (are you missing a using directive or an assembly reference? Как можно реализовать метод Add в классе, чтобы конструкция инициализатора работала? Или же это недопустимо?
Ответы
Ответ 1
Если не нужно использовать foreach loop, а нужна только инициализация значений блоком инициализатора, то достаточно просто унаследоваться от IEnumerable, по сути не реализуя сам метод GetEnumerator() и добавить метод Add(): public class MyClass : IEnumerable { private Listarray = new List (); public int this[int index] { get { return array[index]; } set { array[index] = value; } } public IEnumerator GetEnumerator() { throw new NotImplementedException(); } public void Add(int value) { this.array.Add(value); } } Такой класс можно инициализировать следующим образом: MyClass instance = new MyClass { 1, 2, 6, 7, 8, 9, 10 }
Комментариев нет:
Отправить комментарий