Почему C # не реализует индексированные свойства?

Я знаю, я знаю ... Ответ Эрика Липперта на этот вопрос обычно звучит примерно так:потому что это не стоило затрат на разработку, внедрение, тестирование и документирование».

Но все же, я хотел бы лучшего объяснения ... Я читалэтот блог о новых возможностях C # 4и в разделе о COM Interop, следующая часть привлекла мое внимание:

Кстати, в этом коде используется еще одна новая функция: индексированные свойства (более подробно рассмотрим эти квадратные скобки после Range.)Но эта функция доступна только для COM-взаимодействия; Вы не можете создавать свои собственные проиндексированные свойства в C # 4.0.

Хорошо, но почему ? Я уже знал и сожалел о том, что невозможно создать индексированные свойства в C #, но это предложение заставило меня снова подумать об этом. Я вижу несколько веских причин для его реализации:

CLR поддерживает это (например,PropertyInfo.GetValue имеетindex параметр), поэтому жаль, что мы не можем воспользоваться этим в C #поддерживается COM-взаимодействие, как показано в статье (с использованием динамической отправки)это реализовано в VB.NETуже можно создавать индексаторы, то есть применять индекс к самому объекту, так что, вероятно, не составит труда распространить идею на свойства, сохраняя тот же синтаксис и просто заменяяthis с названием свойства

Это позволило бы написать такие вещи:

public class Foo
{
    private string[] _values = new string[3];
    public string Values[int index]
    {
        get { return _values[index]; }
        set { _values[index] = value; }
    }
}

В настоящее время я знаю единственный обходной путь - создать внутренний класс (ValuesCollection например), который реализует индексатор, и изменитьValues свойство, так что он возвращает экземпляр этого внутреннего класса.

Это очень легко сделать, но раздражает ... Так что, возможно, компилятор мог бы сделать это для нас! Можно было бы сгенерировать внутренний класс, который реализует индексатор, и предоставить его через общий универсальный интерфейс:

// interface defined in the namespace System
public interface IIndexer<TIndex, TValue>
{
    TValue this[TIndex index]  { get; set; }
}

public class Foo
{
    private string[] _values = new string[3];

    private class <>c__DisplayClass1 : IIndexer<int, string>
    {
        private Foo _foo;
        public <>c__DisplayClass1(Foo foo)
        {
            _foo = foo;
        }

        public string this[int index]
        {
            get { return _foo._values[index]; }
            set { _foo._values[index] = value; }
        }
    }

    private IIndexer<int, string> <>f__valuesIndexer;
    public IIndexer<int, string> Values
    {
        get
        {
            if (<>f__valuesIndexer == null)
                <>f__valuesIndexer = new <>c__DisplayClass1(this);
            return <>f__valuesIndexer;
        }
    }
}

Но, конечно, в этом случае имущество будетна самом деле вернутьIIndexer<int, string>и не будет индексированным свойством ... Было бы лучше создать реальное индексированное свойство CLR.

Как вы думаете ? Хотели бы вы видеть эту функцию в C #? Если нет, то почему?

Ответы на вопрос(9)

Ваш ответ на вопрос