2012-02-14 8 views
5

メトロスタイルアプリケーション(win8)で使用するC#WinRTコンポーネントを作成しようとしていますが、投影型に問題があります。リスト<T>またはC#WinRTコンポーネントの<T,T2>辞書

保護レベルのため、データタイプにアクセスできないようですか?

マイサンプルWinMDライブラリは、1つのクラスを持っている:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Windows.Foundation.Collections; 

namespace ClassLibrary1 
{ 
    public sealed class Class1 
    { 
     public IVector<string> foo() 
     { 
      return new List<string>(); 
     } 
    } 
} 

私は、次のコンパイラエラーを取得:

Inconsistent accessibility: return type 'Windows.Foundation.Collections.IVector<string>' is less accessible than method 'ClassLibrary1.Class1.foo()' 

'Windows.Foundation.Collections.IVector<string>' is inaccessible due to its protection level 

は私が間違って何をしているのですか?

編集:

Ah ha!

私はWinRTタイプ名を直接使用するのではなく、翻訳された.NET名を使用するべきです。

正しいコードは次のようになります

namespace ClassLibrary1 
{ 
    public sealed class Class1 
    { 
     public IList<string> foo() 
     { 
      return new List<string>(); 
     } 
    } 
} 
+0

これは、そのコアでネイティブAPIを使用するWinRTコンポーネントです。したがって、リスト - > IVector を投影する必要があります。詳細はhttp://msdn.microsoft.com/en-us/library/windows/apps/br230301(v=vs.110).aspxを参照してください。マッピングテーブルは、ページのほぼ中間にあります。 –

答えて

6

IIterable<T>IEnumerable<T>として.NETに投影され、IVector<T>IList<T>として投影され、そしてIMap<T>IDictionary<T>として投影されます。プロジェクションは消費とオーサリングの両方に役立ちます。そのため、.NETコードでこれらのインターフェイスの投影バージョンを常に使用しているだけです。返されるメンバーがIList<T>であると宣言すると、WinRTの観点から(例えばC++/CXの)IVector<T>と表示されます。同様に、クラスにIDictionaryを実装すると、C++/CXにIMapを実装するように表示されます。

正しく覚えていれば、.NETプロジェクト用にObject Browserを使用する場合には、すべての型が既にマップされているはずです。

+0

これは実際に私が見ている保護レベルのエラーを説明していません。 –

+0

私の質問に直接答えは出ていませんが、あなたは正しい方向に私を指摘しました。私は自分の投稿を更新しました。乾杯! –

+0

私は十分にはっきりしていなかったと思います。元の 'IVector'とstuffは.winmdにあります(したがって、保護レベルのエラー)、あなたはそれを直接使用するつもりはなく、代わりに説明されている置換を常に使用します。私は検索でここに来た他の人のための答えを更新します。 –

関連する問題