假设我们有一个非常简单的功能
let fn a = a.ToString()
它的类型被推断为a -> string
但是,将单位值传递给函数会导致NullReferenceException。
如果像上面这样简单的功能,这可能很容易解决,但我实际上是在一个更复杂的场景中:
let eitherToHttp e =
match e with
| Either.Ok v -> OK (v.ToString())
| Either.Bad reason -> reasonToErrorCode reason
这个类型是Either<'a, RejectReason> -> WebPart
(实际上WebPart
和Either
实际上是无关紧要的)
在e
的类型为Either<unit, RejectReason>
的情况下,函数抛出的方式与简单方案完全相同。
我怎样才能以一种好的方式克服这个问题? 是否应该将类型推断为通用类型,如果实际上这不适用于所有类型?
答案 0 :(得分:6)
使用内置的string
函数,而不是在对象上调用ToString
:
> string 42;;
val it : string = "42"
> string ();;
val it : string = ""
答案 1 :(得分:3)
您可以这样做:
let fn a = match box a with
| null -> ""
| _ -> a.ToString()
在尝试调用a
之前,这会在ToString
上进行无效检查。