我正在尝试实现一个同时实现IList
和IList<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'
任何提示?
答案 0 :(得分:5)
JaredPar's answer几乎奏效了。应该改变两件事:
即:
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
的成员;