2012-02-27 6 views
4

У меня есть следующий F # код:Как перевести строку в F #?

//Array iter version 
let toSecureString (s:string) = 
    let sString = new SecureString() 
    s |> Array.iter (fun cl -> sString.AppendChar cl) 
    sString 

Я пытаюсь преобразовать строку в .Net .Net SecureString. Когда я пытаюсь скомпилировать я получаю ошибку типа несовпадение:

stdin(60,10): error FS0001: Type mismatch. Expecting a 
    string -> 'a 
but given a 
    'b [] -> unit 
The type 'string' does not match the type ''a []' 

Если я не указать тип с, это тип подписи я вижу:

val toSecureString : char [] -> SecureString 

Но поскольку я не» t нужно, чтобы каждый раз вручную создавать массив символов для аргумента, кажется, что я что-то упускаю. Как я могу заставить этот код работать с передаваемым параметром строки?

Если это имеет значение, я тестирую F # 2.0 (Build 4.0.40219.1).

Любые подсказки приветствуются. Если это уже было задано и ответили, напишите ссылку в комментариях, и я закрою этот вопрос.

+0

Почему вы используете 'SecureString' вообще? Если у вас уже есть строка, то копирование ее на «SecureString» не добавит никакой безопасности, я думаю. Вероятно, поэтому нет 'AppendString()'. – svick

+0

Я использую SecureString, потому что для Windows API требуется SecureString. –

+0

Ничего себе, ребята, три отличных ответа. Хотел бы я выбрать все из них в качестве «принятого ответа» –

ответ

12

Использовать Seq.iter, а не Array.iter, потому что строки char seq s, но не char[] s.

+0

Спасибо kvb. Знал, что мне не хватает чего-то очевидного. –

5

Чтобы управлять строкой как char seq, можно использовать String module. Это работает:

let toSecureString s = 
    let sString = new SecureString() 
    String.iter sString.AppendChar s 
    sString 
+0

Спасибо @pad Я не знал об этом. –

+0

На самом деле, я предпочитаю использовать модуль String для модуля Seq, чтобы избежать аннотации типа :). – pad

+0

Извините @ pad - какой аннотация? Если я использую Seq.iter, мне не нужна спецификация типа в s или cl в приведенном выше коде. –

3

Вы также можете сделать это:

SecureString(&&s.ToCharArray().[0], s.Length) 
+0

Спасибо @ Daniel - третий подход к этому. У меня есть другой подход, который я не опубликовал. –

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