2013-03-26 3 views
4

Кажется, что WebSharper имеет некоторые трудности с преобразованием между целыми типами (скажем, - uint64). Я получаю это:Преобразование между целыми типами в WebSharper

ошибку: Не удалось перевести вызов метода: ToUInt64 (..) [Microsoft.FSharp.Core.Operators]

То же самое происходит с int32 ->uint32, int16 - >int32 и многие другие (только byte < ->int32, похоже, работает).

Итак, вопрос: как мне обойти эту проблему? У меня есть целое число i (это int32, так как я ничего не могу получить), и теперь я хочу получить i-й элемент из Uint8Array. Uint8Array.Get хочет uint64. Как мне преобразовать i в uint64?

Я собирался использовать чит-код [<Inline>], но это тоже не сработает, потому что я получаю эту ошибку, даже если пытаюсь вернуться или передать в качестве аргумента любое целое число, отличное от int32.

+2

Покажите нам свой код. – mydogisbox

+3

Мне любопытно, какова ваша мотивация для использования этих типов? В настоящее время ни один из них не был правильно реализован, но представлен как «Number» в JS, поэтому вы всегда можете «магия» -конвертировать: 'As (x: int32)'. – t0yv0

+0

@toyvo Я разбираю двоичный файл (это будет виртуальная машина, но это не имеет большого значения). Я надеялся, что статические типы проведут меня через лабиринт этого двоичного формата, но выяснится, что 1) я не могу использовать его для уменьшения числа ошибок; 2) Я не могу использовать его вообще. Я понимаю, что после перевода в JS это не будет иметь никакого значения, но мне просто нужны проверки времени компиляции. – kirelagin

ответ

4

Из ваших комментариев это звучит так, будто вы на правильном пути. В настоящее время WebSharper не реализует какой-либо двоичной обработки .NET API, поэтому правильно реализовать его самостоятельно. Использование числовых типов для разумного времени компиляции, имея в виду, что все они представлены как Number в JavaScript, также является хорошей идеей. Если вам не хватает прокси-преобразований из стандартной библиотеки, вы можете добавить их или использовать Inline определения, я считаю, что это должно работать:

[<AutoOpen>] 
module Conversions = 

    [<Inline "$0">] 
    let inline int64 x = int64 x 

    [<Inline "$0">] 
    let inline int32 x = int32 x 

    [<Inline "$0">] 
    let inline uint32 x = uint32 x 

    [<Inline "$0">] 
    let inline uint64 x = uint64 x 

Конечно вышеуказанные реализации не делает усечение, что эти операторы делают в F # /.СЕТЬ.

+0

Ничего себе, этот трюк работал как шарм! Благодаря! – kirelagin

+0

@kirelagin звучит так, как будто вы делаете некоторые серьезно классные вещи. Мне нравятся виртуальные машины. Пожалуйста, продолжайте размещать здесь или на [Fpish] (http://fpsih.net), если вы придерживаетесь WebSharper и имеете вопросы. Я также хотел бы видеть приложение, которое вы делаете, если возможно, то есть.Приветствия. – t0yv0

+0

ОК, я сообщу вам, когда почувствую, что он готов к публичному репо. В качестве предварительного просмотра вы можете проверить [это] (http://kir.elagin.me/~kirrun/bach-rationale.pdf) (это на русском языке, но я надеюсь, что это не проблема). – kirelagin

Смежные вопросы