Как использовать List‹T› или Dictionary‹T,T2› в компоненте C# WinRT

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

Кажется, что типы данных IVector‹> и IMap‹> недоступны из-за их уровня защиты?

Моя примерная библиотека 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

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

РЕДАКТИРОВАТЬ:

Ah ha!

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

Правильный код выглядит так:

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

person Ty Norton    schedule 14.02.2012    source источник
comment
Это компонент WinRT, в основе которого лежат собственные API. Поэтому ему нужно спроецировать List‹T› -> IVector‹T›. См. msdn.microsoft.com/ en-us/library/windows/apps/ для более подробной информации. Таблица сопоставления находится примерно на полпути вниз по странице.   -  person Ty Norton    schedule 15.02.2012


Ответы (1)


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.

person Pavel Minaev    schedule 14.02.2012
comment
Это на самом деле не объясняет ошибки уровня защиты, которые я вижу. - person Ty Norton; 15.02.2012
comment
Хотя это и не прямой ответ на мой вопрос, вы указали мне правильное направление. Я обновил свой пост. Ваше здоровье! - person Ty Norton; 15.02.2012
comment
Думаю, я не совсем ясно выразился. Исходный IVector и прочее находится в .winmd (отсюда и эти ошибки уровня защиты), вы просто не должны использовать его напрямую, вместо этого всегда используя описанную замену. Я обновлю ответ для других, которые приходят сюда через поиск. - person Pavel Minaev; 15.02.2012
comment
Некоторые соответствующие ссылки из MSDN: msdn.microsoft.com/en-us/library/ br230301.aspx и msdn.microsoft.com/en-us/ библиотека/hh700103.aspx. - person Pol; 10.12.2015
comment
Обратите внимание, что на практике все немного сложнее, чем следует из этого ответа: вы создаете Vector<T> в C++/CX, который затем получает проекты как IList<T> в C#. Или вы создаете List<T> в C#, который проецируется как IVector<T> в C++/CX. Вы не можете создать IVector<T> или IList<T>. - person Pol; 10.12.2015