F # и ExecuteScalar приведение - PullRequest
0 голосов
/ 02 июня 2009

Как я могу использовать DbCommand.ExecuteScalar из F #? Он возвращает объект, который мне нужно преобразовать в int. Я очень новичок в F # и кастинг, который мне нужно сделать, неясен.

let (stockid:uint32) = command.ExecuteScalar()

Compile Error: 
Type constraint mismatch. The type   obj is not compatible with type  uint32 

Обновление с помощью:?> Выдает ошибку времени выполнения.

Ответы [ 3 ]

4 голосов
/ 02 июня 2009

Если вы просто скажете

let o : obj = ...
printfn "%s" (o.GetType().ToString())

что вы получаете? Это действительно int? (int32 или uint32 или что?)

Оператор:?> Является правильным оператором downcast, но вам нужно, чтобы типы соответствовали. После приведения к фактическому типу, если вам нужно преобразовать один интегральный тип в другой, используйте соответствующую функцию для целевого типа, например

let x : int = int myUnsignedInt  
// first 'int' is type, second is function to convert-to-int
0 голосов
/ 02 июня 2009

Попробуйте привести его к int32 вместо uint32. ExecuteScalar возвращает объект типа int32.

0 голосов
/ 02 июня 2009

Если Downcast (:?>) Генерирует во время выполнения, вы не получите unit32 в качестве возвращаемого значения из Execute Scalar. Вы должны быть в состоянии конвертировать ...

let stockid : uint32 = unit32 command.ExecuteStalar()

Но если вы получаете что-то, что не может быть преобразовано в uint32, это тоже не удастся. Подробнее о приведении и преобразовании здесь .

...