2012-02-14 16 views
5

Estoy tratando de crear un componente C# WinRT para su uso en aplicaciones de estilo metro (win8) y tengo problemas con los tipos proyectados.Cómo usar List <T> o Dictionary <T,T2> en C# WinRT componente

Parece que los tipos de datos IVector <> y IMap <> son inaccesibles debido a su nivel de protección?

mi ejemplo WinMD Biblioteca tiene una clase:

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

consigo los siguientes errores de compilación:

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 

¿Qué estoy haciendo mal?

EDITAR:

¡Ah, ja!

Resulta que no debería estar usando los nombres de tipo WinRT directamente, sino que usaré sus nombres traducidos de .NET en su lugar.

El código correcto es el siguiente:

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

Este es un componente WinRT que utiliza API nativas en su núcleo. Por lo tanto, necesita proyectar la lista -> IVector . Consulte http://msdn.microsoft.com/en-us/library/windows/apps/br230301(v=vs.110).aspx para obtener más detalles. La tabla de mapeo está a la mitad de la página. –

Respuesta

6

IIterable<T> se proyecta a .NET como IEnumerable<T>, IVector<T> se proyecta como IList<T> y IMap<T> se proyecta como IDictionary<T>. La proyección va en ambos sentidos, tanto para el consumo como para la creación, por lo que siempre debe utilizar las versiones proyectadas de esas interfaces en su código .NET. Cuando declara que un miembro regresa al IList<T>, se mostrará como IVector<T> desde la perspectiva de WinRT (por ejemplo, desde C++/CX). Del mismo modo, si implementa IDictionary en su clase, se mostrará como la implementación de IMap en C++/CX.

Si no recuerdo mal, debería ver todos los tipos ya asignados como deberían ser cuando utiliza Object Browser para un proyecto .NET.

+0

Eso realmente no explica los errores de nivel de protección que estoy viendo. –

+0

Aunque no es una respuesta directa a mi pregunta, me apuntó en la dirección correcta. He actualizado mi publicación. ¡Aclamaciones! –

+0

Creo que no estaba lo suficientemente claro. El 'IVector' original y esas cosas están en .winmd (de ahí esos errores de nivel de protección), simplemente no está destinado a usarlo directamente, siempre utilizando la sustitución que se describe en su lugar. Actualizaré la respuesta para otros que vienen aquí a través de la búsqueda. –

Cuestiones relacionadas