【问题标题】:C++/CLI: Implementing IList and IList<T> (explicit implementation of a default indexer)C++/CLI:实现 IList 和 IList<T>(默认索引器的显式实现)
【发布时间】:2010-10-15 22:31:38
【问题描述】:

我正在尝试实现一个同时实现 IListIList&lt;T&gt; 的 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:语法错误:标识符“默认”

有什么提示吗?

【问题讨论】:

  • 请更改“同时实现 IList 和 IList”。到“实现 IList 和 IList”。
  • 谢谢!似乎降价正在删除 .

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


【解决方案1】:

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

  • indexer-property 需要一个不同的名称,因为隐式实现已采用“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】:

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

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

【讨论】:

    【解决方案3】:

    我编译了一个用 C# 显式编写的实现 IList&lt;T&gt; 的类,并用 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&lt;T&gt; 的成员;

    【讨论】:

    • Reflector 反汇编为托管 C++ 而不是 C++/CLI。托管 C++ 是较旧的托管代码扩展。您可以通过所有 __gc 指针来判断。
    • Reflector 有一个扩展,可以生成 C++/CLI。不幸的是,它也给出了不可编译的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 2010-11-13
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多