我正在尝试使用 F# 默认情况下的错误:异常。
我想使用 Result 类型处理错误,但如果我尝试返回 Exception 的特化(例如 ArgumentException)作为错误,Visual Studio 会显示“此函数接受太多参数,或者在不需要函数的上下文中使用” 。
我的来源:
let division (x: float) (y: float): Result<float, Exception> =
if x = 0.0 then
Error (ArgumentException ())
else
Ok (x / y)
Run Code Online (Sandbox Code Playgroud)
您的代码的问题是新创建的类型ArgumentException与Exception与您在类型签名中指定的类型
您可以使用运算符安全地ArgumentException进行强制转换,但 F# 不会自动插入强制转换,因此您必须自己编写:Exception:>
let division (x: float) (y: float): Result<float, Exception> =
if x = 0.0 then
Error (ArgumentException () :> Exception)
else
Ok (x / y)
Run Code Online (Sandbox Code Playgroud)
事实上,F# 甚至可以从类型注释推断目标类型,因此您可以只写:
Error (ArgumentException () :> _)
Run Code Online (Sandbox Code Playgroud)
PS:我看到你说你收到“该函数需要太多参数”错误。这很奇怪,也许你的情况还有更多的事情发生。当我尝试你的代码时出现的错误是“这个表达式本来应该有类型,Exception但实际上是ArgumentException”所以也许你也在重新定义一些标准类型......