如何在C#WinRT组件中使用List <t>或Dictionary <t,t2> </t,t2> </t>

时间:2012-02-14 23:24:58

标签: c# winapi windows-8 windows-runtime microsoft-metro

我正在尝试创建一个用于Metro风格应用程序(win8)的C#WinRT组件,并且我遇到了投影类型的问题。

似乎是IVector&lt;&gt;和IMap&lt;&gt;数据类型由于其保护级别而无法访问?

我的示例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

我做错了什么?

编辑:

啊哈!

原来我不应该直接使用WinRT类型名称,而是使用他们翻译的.NET名称。

正确的代码如下所示:

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

1 个答案:

答案 0 :(得分:6)

IIterable<T>投影到.NET IEnumerable<T>IVector<T>投影为IList<T>IMap<T>投影为IDictionary<T>。投影有两种方式 - 无论是用于消费还是用于创作 - 因此您应该始终在.NET代码中使用这些接口的预计版本。当您将成员声明为返回IList<T>时,它将从WinRT角度显示为IVector<T>(例如,来自C ++ / CX)。同样,如果您在类上实现IDictionary,它将在C ++ / CX中显示为实现IMap

如果我没记错的话,当您使用.NET项目的对象浏览器时,您应该看到已经映射的所有类型。

相关问题