F#有一些简洁的参数检查函数,可以像这样使用:
let foo (bar : string) : string =
if bar = null then
nullArg "bar"
...
我更喜欢一种更规范的表达方式,例如Code Contracts:
let foo (bar : string) : string =
Contract.Requires (bar <> null, "bar is null")
...
我梦想写的代码是这样的,但是:
let nonNull (expr : Expr) : unit =
// quotation magic
let foo (bar : string) : string =
nonNull <@ bar @>
...
问题是:这个能用F#表达吗?或者换句话说,是否有一个针对非空的工作实现可以使用F#?在我看来好像没有,但也许这里有人可以确认一下。
<@ bar @>
没有包含任何关于参数名称的信息。 - svickif bar = null then nullArg "bar"
有32个字符,而Contract.Requires (bar <> null, "bar is null")
有46个字符,所以我不明白为什么它不够紧凑。一般来说,.NET没有Eiffel式的断言... - Mark Seemann