2012-09-04 10 views
13

Aquí es una interfaz, tomado de mi intento de puerto MemBus, un agregador de eventos que mantener, al mundo de Windows en tiempo de ejecución:Los métodos de Windows Runtime no pueden ser genéricos: razones, soluciones alternativas.

public interface ISubscriber 
{ 
    IDisposable Subscribe<M>(Action<M> subscription); 

    #if WINRT 
    [Windows.Foundation.Metadata.DefaultOverload] 
    #endif 
    IDisposable Subscribe(object subscriber); 

    IObservable<M> Observe<M>(); 
} 

Lo que quiero decir es un error del compilador:

"error WME1031: ' MemBus.ISubscriber.Subscribe<M>(System.Action<M>) ' is a generic method. Windows Runtime methods cannot be generic."

Solo tengo sospechas de por qué este es el caso, si alguien puede aclarar, por favor hazlo.

Mi pregunta principal es: ¿Cómo se supone que debemos ocuparnos de esto al transferir el código al tiempo de ejecución de Windows?

Mucha funcionalidad de nivel superior sucede con los genéricos. De hecho, usamos clases genéricas en Windows Runtime (por ejemplo, List<T>). ¿Cómo se supone que un componente RT expone los tipos genéricos y, de no ser así, es la única alternativa disponible para volver a las formas de escribir el código .NET 1.1, es decir, el objeto in, object out y do castts?

Respuesta

11

Debe elegir una plantilla Biblioteca de clases de las plantillas de Windows Store (no la plantilla de Windows Runtime Component).

Screenshot VS2012

Esto le permitirá utilizar el lenguaje completo de C# en una aplicación de Windows Store, pero no permitirá que otros lenguajes como C++ y JS para consumir el conjunto (ya que no son compatibles con los genéricos en el de la misma manera que C# lo hace).

+0

Estoy marcando esto como una respuesta, ya que estaba pensando en portar. Al portar una biblioteca .NET que estaba destinada a ser consumida principalmente por otros lenguajes .NET, parece tener sentido restringirse a apuntar a C# y omitir el soporte de C++/Javascript a favor de mantener muchas construcciones conocidas por el desarrollador de C# durante muchos años. Cuando se trata de un nuevo desarrollo, la respuesta puede ser diferente. – flq

Cuestiones relacionadas