C ++ / CLI:实现IList和IList <t>(默认索引器的显式实现)</t>

时间:2009-03-27 13:08:21

标签: c++-cli indexer explicit-interface

我正在尝试实现一个同时实现IListIList<T>的C ++ / CLI类。

由于它们具有重叠的名称,我必须明确地实现其中一个,并且自然选择应该是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:语法错误:标识符'default'

任何提示?

3 个答案:

答案 0 :(得分:5)

JaredPar's answer几乎奏效了。应该改变两件事:

  • indexer-property需要一个不同的名称,因为隐式实现已经采用了“default”。
  • 需要在set-和get-methods上进行覆盖规范,而不是在属性本身上进行。

即:

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

答案 1 :(得分:2)

在C ++ / CLI中没有做过很多接口,但这似乎涵盖了C++/CLI spec的8.8.10.1。我相信你正在寻找的功能是明确的重写。在此,您必须在定义之后指定实现的成员,如此。

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

答案 2 :(得分:0)

我编译了一个用C#显式编写的实现IList<T>的类,并用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)
{
   //
}

但它无法编译:{{1​​}},get_Item不是set_Item的成员;