5

IListと の両方を実装する C++/CLI クラスを実装しようとしていますIList<T>

名前が重複しているため、そのうちの 1 つを明示的に実装する必要があり、当然の選択として 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の答えはほとんど機能しました。2つのことを変更する必要があります。

  • 「デフォルト」は暗黙の実装によってすでに使用されているため、インデクサープロパティには別の名前が必要です。
  • オーバーライドの指定は、プロパティ自体ではなく、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;
  }
于 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

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)
{
   //
}

しかし、それはコンパイルされません: get_Item,は;set_Itemのメンバーではありません.IList<T>

于 2009-03-27T13:24:16.947 に答える