C ++ / CLI: реализация IList и IList <T>(явная реализация индексатора по умолчанию) - PullRequest
5 голосов
/ 27 марта 2009

Я пытаюсь реализовать класс C ++ / CLI, который реализует IList и IList<T>.

Поскольку они имеют перекрывающиеся имена, я должен явно реализовать одно из них, и естественным выбором должен быть IList.

Неявная реализация индексатора:

using namespace System::Collections::Generic;
generic<class InnerT> public ref class MyList : public System::Collections::IList, IList<InnerT> {
  // ...
  property InnerT default[int]{
    virtual InnerT get(int index);
    virtual void set(int index, InnerT item);
  }
}

Я сейчас пытаюсь объявить индексатор по умолчанию для IList.

Мое предположение будет примерно таким:

  property Object^ System::Collections::IList::default[int]{
    virtual Object^ System::Collections::IList::get(int index);
    virtual void System::Collections::IList::set(int index, Object^ item);
  }

но это только дает мне

ошибка C2061: синтаксическая ошибка: идентификатор «по умолчанию»

Есть подсказки?

Ответы [ 3 ]

5 голосов
/ 27 марта 2009

Ответ ДжаредПара почти сработал. Две вещи должны быть изменены:

  • Свойству indexer требуется другое имя, поскольку неявная реализация уже использует "default".
  • Спецификация переопределения должна выполняться для методов set и get, а не для самого свойства.

т.е:.

  property Object^ IListItems[int]{
    virtual Object^ get(int index) = System::Collections::IList::default::get;
    virtual void set(int index, Object^ item)  = System::Collections::IList::default::set;
  }
2 голосов
/ 27 марта 2009

В C ++ / CLI не реализовано много интерфейсов, но, похоже, это описано в 8.8.10.1 спецификации C ++ / CLI . Я считаю, что функция, которую вы ищете, явно переопределяет. В этом вы должны указать реализованный элемент после определения, например, так.

property Object^ default[int] = System::Collections::IList::default {... }
0 голосов
/ 27 марта 2009

Я скомпилировал класс, реализующий IList<T>, явно написанный на C #, открыл его с помощью Reflector и разобрал на C ++ / CLI.

T System::Collections::Generic::IList<T>::get_Item(Int32 __gc* index)
{
   //
}

void __gc* System::Collections::Generic::IList<T>::set_Item(Int32 __gc* index, T value)
{
   //
}

Но он не компилируется: get_Item, set_Item не является членом IList<T>;

...