5

我正在尝试实现一个同时实现IList和的 C++/CLI 类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:语法错误:标识符“默认”

有什么提示吗?

4

3 回答 3

5

JaredPar 的回答几乎奏效了。应该改变两点:

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

IE:

  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;
  }
于 2009-03-27T13:50:44.590 回答
2

没有在 C++/CLI 中完成很多接口,但这似乎涵盖了C++/CLI 规范的 8.8.10.1 。我相信您正在寻找的功能是显式覆盖。在这种情况下,您必须像这样在定义之后指定实现的成员。

property Object^ default[int] = System::Collections::IList::default {... }
于 2009-03-27T13:31:46.537 回答
0

我编译了一个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_Itemset_Item不是IList<T>;的成员

于 2009-03-27T13:24:16.947 回答