Подтвердить что ты не робот

"System.DateTime" не является допустимым типом параметра Runtime Windows

Я использую класс С#, и он отлично работает в моем приложении для Windows Store (С#). Но когда я пытаюсь использовать его в Windows Runtime Compenent, я получаю следующую ошибку:

Calculator.Calculate(System.DateTime) 'имеет параметр' dateTime 'типа' System.DateTime '. "System.DateTime" не является допустимым типом параметра времени выполнения Windows.

Образец объекта в классе:

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

Как я могу это исправить? И в чем проблема?

4b9b3361

Ответ 1

Когда вы создаете компонент Runtime Windows, ваш компонент может использоваться не управляемыми языками, как Javascript или С++. Очевидно, что эти языки не имеют представления о том, как создать правильный System.DateTime, это особый тип .NET.

Таким образом, такие компоненты должны использовать только родные типы WinRT и в противном случае соблюдать ограничения, имеющиеся в WinRT. Одним из таких ограничений, с которыми вы столкнетесь, является то, что WinRT не поддерживает наследование реализации. Это требует, чтобы вы объявили свой класс закрытым.

Собственные типы WinRT очень не похожи на типы .NET. Реальный тип времени выполнения, который может хранить дату, - Windows.Foundation.DateTime. Строка на самом деле является дескриптором HSTRING. Список фактически является IVector. Etcetera.

Излишне говорить, что если вам действительно нужно будет использовать эти родные типы, ваша программа больше не будет похожа на .NET-программу. И вы этого не сделаете, версия .NET 4.5 CLR имеет встроенную версию языка. Код, который автоматически переводит типы WinRT в их эквивалентные типы .NET. Этот перевод имеет несколько грубых краев, некоторые типы не могут быть легко заменены. Но подавляющее большинство из них без проблем.

System.DateTime - это один такой грубый край. Проекция языка Windows.Foundation.DateTime - System.DateTimeOffset. Поэтому просто решите свою проблему, объявив свой метод следующим образом:

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

Единственное, что стоит отметить, это то, что это требуется только членам, которые может использовать другой код. Публичные участники.