Тип нулевого значения, используя F # - PullRequest
0 голосов
/ 25 августа 2011

Есть ли способ получить тип нулевого значения?Это не работает:

let a: string = null
let typ = a.GetType()

Спасибо

Ответы [ 3 ]

5 голосов
/ 25 августа 2011
let getStaticType<'T>(_x : 'T) = typeof<'T>
let a : string = null 
let b : int[] = null
let typ1 = getStaticType a
let typ2 = getStaticType b
printfn "%A %A" typ1 typ2
// System.String System.Int32[]
4 голосов
/ 25 августа 2011

Решение Брайана, вероятно, делает то, что вам нужно, но на практике оно вам не нужно.

Тип времени выполнения - Если вам действительно нужно определить тип значения во время выполнения (используя GetType), то это, вероятно, потому, что тип может быть более конкретным, чем то, что предлагает статический тип (то есть был де-сериализован или создан с использованием Reflection, и вы получили значение типа obj или некоторый интерфейс). В этом случае вам нужно явно обработать null, потому что getStaticType всегда даст вам obj:

let handleAtRuntime (value:obj) =
  match value with 
  | null -> // handle null
  | _ -> let typ = value.GetType()
         // do something using runtime-type information

Статический тип - Если вам просто нужно знать System.Type статически известного типа, тогда вы сможете написать все, что вам нужно, используя typeof<_>. Это полезно, когда у вас есть общие функции:

let handleStatically (value:'T) =
  let typ = typeof<'T>
  // do something with the type (value still may be null)

В вашем примере вам не нужно динамическое поведение, потому что вы можете быть уверены, что тип значения - string, так что вы можете использовать решение Брайана, но использование typeof<string> тоже подойдет.

1 голос
/ 25 августа 2011

Я не уверен, что это лучший ответ, но вы можете использовать Цитаты для получения типа с помощью.

Например:

let get_type x = <@ x @>.Type.FullName

И тест:

let a : string = null
let a' = get_type a

val a : string = null
val a' : string = "System.String"

let a : int[] = null
let a' = get_type a

val a : int [] = null
val a' : string = "System.Int32[]"
...