C ++ / CLI: Implementando IList e IList (implementação explícita de um indexador padrão)

StackOverflow https://stackoverflow.com/questions/689704

Pergunta

Eu estou tentando implementar um C ++ / CLI classe que implementa tanto IList e IList<T>.

Uma vez que eles têm sobreposição de nomes, eu tenho que implementar um deles explicitamente, e a escolha natural deve ser IList.

A implementação implícita do indexador é:

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);
  }
}

Agora estou tentando declarar o indexador padrão para IList.

Meu palpite seria algo como isto:

  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);
  }

mas isso só me dá

Erro C2061: erro de sintaxe: identificador 'default'

Alguma dica?

Foi útil?

Solução

JaredPar é responder quase funcionou. Duas coisas devem ser alterados:

  • O indexador-propriedade precisa de um nome diferente, pois "default" já está tomada pela implementação implícita.
  • A especificação das necessidades imperiosas de ser feito no set e get-métodos, não na própria propriedade.

ou seja:.

  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;
  }

Outras dicas

não têm feito uma série de interfaces em C ++ / CLI, mas este parece ser coberta 8.8.10.1 do C ++ / CLI especificação . Eu acredito que o recurso que você está procurando é primordial explícito. Neste você deve especificar o membro implementada após a definição assim.

property Object^ default[int] = System::Collections::IList::default {... }

Eu compilei uma classe implementando IList<T> explicitamente escrito em C # e abriu-a com refletor e desmontado para 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)
{
   //
}

Mas isso não compilar: get_Item, set_Item não é membro de IList<T>;

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top