【问题标题】:How to use List<T> or Dictionary<T,T2> in C# WinRT component如何在 C# WinRT 组件中使用 List<T> 或 Dictionary<T,T2>
【发布时间】:2012-03-06 08:15:43
【问题描述】:

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

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

我做错了什么?

编辑:

啊哈!

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

正确的代码如下所示:

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

【问题讨论】:

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


【解决方案1】:

IIterable&lt;T&gt; 投影到 .NET 为 IEnumerable&lt;T&gt;IVector&lt;T&gt; 投影为 IList&lt;T&gt;IMap&lt;T&gt; 投影为 IDictionary&lt;T&gt;。投影是双向的——消费和创作——所以你应该总是在你的 .NET 代码中使用这些接口的投影版本。当您将成员声明为返回 IList&lt;T&gt; 时,从 WinRT 角度来看(例如从 C++/CX),它将显示为 IVector&lt;T&gt;。同样,如果你在你的类上实现IDictionary,它会显示为在C++/CX 中实现IMap

如果我没记错的话,你应该看到所有类型都已经映射,当你将对象浏览器用于 .NET 项目时它们应该是这样的。

【讨论】:

  • 这并不能真正解释我看到的保护级别错误。
  • 虽然不是直接回答我的问题,但您为我指明了正确的方向。我已经更新了我的帖子。干杯!
  • 我想我还不够清楚。原始的 IVector 和 .winmd 中的内容(因此出现了这些保护级别错误),您只是不打算直接使用它,而是始终使用所描述的替换。我会为其他通过搜索来到这里的人更新答案。
  • 请注意,实际上事情比这个答案所暗示的要复杂一些:您在 C++/CX 中创建一个 Vector&lt;T&gt;,然后在 C# 中将项目作为 IList&lt;T&gt; 获取。或者您在 C# 中创建一个 List&lt;T&gt;,它在 C++/CX 中被投影为 IVector&lt;T&gt;。您不能创建 IVector&lt;T&gt;IList&lt;T&gt;
猜你喜欢
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多