2012-02-14 2 views
5

Я пытаюсь создать компонент C# WinRT для использования в приложениях стиля метро (win8), и у меня возникают проблемы с проецируемыми типами.Как использовать Список <T> или Словарь <T,T2> в компоненте C# WinRT

Похоже, что типы данных недоступны из-за их уровня защиты?

Моя Sample WinMD библиотека имеет один класс:

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 

Что я делаю неправильно?

EDIT:

Ah ha!

Оказывается, я не должен использовать имена типов WinRT напрямую, но вместо них вместо них использовать их переведенные имена .NET.

Правильный код выглядит следующим образом:

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

Это компонент WinRT, который использует собственные API в своем ядре. Поэтому необходимо проецировать Список -> IVector . Подробнее см. Http://msdn.microsoft.com/en-us/library/windows/apps/br230301(v=vs.110).aspx. Таблица сопоставления находится примерно на половине страницы. –

ответ

6

IIterable<T> проецируется на .NET, как IEnumerable<T>, IVector<T> проектируется как IList<T> и IMap<T> проецируется IDictionary<T>. Проецирование идет в обоих направлениях - как для потребления, так и для авторинга - поэтому вы всегда должны использовать проецируемые версии этих интерфейсов в вашем коде .NET. Когда вы объявляете член как возвращающийся IList<T>, он будет отображаться как IVector<T> с точки зрения WinRT (например, из C++/CX). Аналогично, если вы реализуете IDictionary в своем классе, он будет отображаться как реализация IMap в C++/CX.

Если я правильно помню, вы должны увидеть все типы, которые уже были отображены так, как они должны быть, когда вы используете Object Browser для .NET-проекта.

+0

Это действительно не объясняет ошибки уровня защиты, которые я вижу. –

+0

Хотя я не был прямым ответом на мой вопрос, вы указали мне в правильном направлении. Я обновил свой пост. Ура! –

+0

Я думаю, что я был недостаточно ясен. Исходный 'IVector' и прочее есть в .winmd (следовательно, эти ошибки уровня защиты), вы просто не должны использовать его напрямую, всегда используя описанную замену. Я обновлю ответ для других, которые приходят сюда через поиск. –

Смежные вопросы