Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Инициализация класса с индексатором

#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 List array = 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 }

Комментариев нет:

Отправить комментарий