2012-02-14 34 views
5

Tôi đang cố gắng tạo thành phần C# WinRT để sử dụng trong các ứng dụng kiểu metro (win8) và đang gặp sự cố với các loại dự kiến.Cách sử dụng Danh sách <T> hoặc Từ điển <T,T2> trong C# Thành phần WinRT

Dường như IVector <> và IMap <> loại dữ liệu không thể truy cập được do mức độ bảo vệ của chúng?

My mẫu WinMD Thư viện có một lớp:

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>(); 
     } 
    } 
} 

tôi nhận được các lỗi biên dịch sau:

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 

Tôi đang làm gì sai?

EDIT:

Ah ha!

Hóa ra tôi không nên sử dụng tên loại WinRT trực tiếp, nhưng thay vì sử dụng tên .NET đã dịch của chúng.

Mã đúng trông như thế này:

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

Đây là một thành phần WinRT sử dụng các API gốc ở lõi của nó. Vì vậy, nó cần phải dự án Danh sách -> IVector . Xem http://msdn.microsoft.com/en-us/library/windows/apps/br230301(v=vs.110).aspx để biết thêm chi tiết. Bảng ánh xạ là khoảng một nửa xuống trang. –

Trả lời

6

IIterable<T> dự kiến ​​sẽ NET như IEnumerable<T>, IVector<T> dự kiến ​​như IList<T>, và IMap<T> dự kiến ​​như IDictionary<T>. Phép chiếu đi theo cả hai cách - cả cho tiêu dùng lẫn cho tác giả - vì vậy bạn chỉ nên sử dụng các phiên bản dự kiến ​​của các giao diện đó trong mã .NET của bạn. Khi bạn khai báo thành viên là trả lại IList<T>, nó sẽ hiển thị dưới dạng IVector<T> từ phối cảnh WinRT (ví dụ: từ C++/CX). Tương tự, nếu bạn triển khai IDictionary trên lớp học của mình, nó sẽ hiển thị khi triển khai IMap bằng C++/CX.

Nếu tôi nhớ chính xác, bạn sẽ thấy tất cả các loại đã được ánh xạ như chúng sẽ là khi bạn sử dụng Trình duyệt đối tượng cho dự án .NET.

+0

Điều đó không thực sự giải thích các lỗi mức độ bảo vệ mà tôi thấy. –

+0

Mặc dù không phải là câu trả lời trực tiếp cho câu hỏi của tôi, bạn đã chỉ cho tôi đúng hướng. Tôi đã cập nhật bài đăng của mình. Chúc mừng! –

+0

Tôi nghĩ tôi không đủ rõ ràng. Bản gốc "IVector' và các công cụ có trong .winmd (do đó những lỗi mức độ bảo vệ), bạn chỉ không có nghĩa là để sử dụng nó trực tiếp, luôn luôn sử dụng thay thế được mô tả để thay thế. Tôi sẽ cập nhật câu trả lời cho những người khác đến đây thông qua tìm kiếm. –

Các vấn đề liên quan