2012-12-08 13 views
13

Utilizzo una classe C# e funziona perfettamente nella mia app di Windows Store (C#). Ma quando cerco di usarlo in un Windows Runtime compenent ricevo il seguente errore:'System.DateTime' non è un tipo di parametro Windows Runtime valido

Calculator.Calculate(System.DateTime)' has parameter 'dateTime' of type 'System.DateTime'. 'System.DateTime' is not a valid Windows Runtime parameter type.

Un oggetto campione nella classe:

public DateTime Calculate(DateTime dateTime) 
{ 
    int dayNumberOfDateTime = ExtractDayNumber(dateTime); 
    int sunRiseInMinutes = CalculateSunRiseInternal(tanSunPosition, differenceSunAndLocalTime); 
    return CreateDateTime(dateTime, sunRiseInMinutes); 
} 

Come posso risolvere questo problema? E qual è il problema?

+1

Cosa succede se lo si cambia da pubblico a interno? –

risposta

25

Quando si crea un componente di Windows Runtime, il componente può essere utilizzato da lingue non gestite, come Javascript o C++. Chiaramente quelle lingue non hanno idea di come generare un System.DateTime adeguato, è un tipo .NET specifico.

Tali componenti devono pertanto utilizzare solo tipi di WinRT nativi e in caso contrario osservare le restrizioni presenti in WinRT. Una restrizione di questo tipo che ti imbatterai dall'inizio è che WinRT non supporta l'ereditarietà dell'implementazione. Il che richiede la dichiarazione della classe sigillata.

I tipi di WinRT nativi sono molto diversi dai tipi .NET. Il vero tipo di runtime che può memorizzare una data è Windows.Foundation.DateTime. Una stringa è in realtà una maniglia HSTRING. Un elenco è in realtà un IVector. Eccetera.

Inutile dire che se si dovessero effettivamente utilizzare quei tipi nativi, il programma non sarebbe più simile a un programma .NET. E non è così, la versione .NET 4.5 di CLR ha un di proiezione di lingua integrato. Codice che traduce automaticamente i tipi WinRT nei loro tipi .NET equivalenti. Quella traduzione ha alcuni spigoli, alcuni tipi non possono essere facilmente sostituiti. Ma la stragrande maggioranza di loro mappa senza problemi.

System.DateTime è uno di questi spigoli. La proiezione della lingua di Windows.Foundation.DateTime è System.DateTimeOffset. Quindi è sufficiente a risolvere il problema, dichiarando il tuo metodo come questo:

public DateTimeOffset Calculate(DateTimeOffset dateTime) { 
    // etc.. 
} 

L'unico altro punto degno di nota è che questo è necessaria solo per i membri che altro codice potrebbe utilizzare. Membri pubblici

Problemi correlati