Exception F#4.5.0.0:错误FS0193:此表达式是函数值,即缺少参数。其类型为异常->';A.

Exception F#4.5.0.0:错误FS0193:此表达式是函数值,即缺少参数。其类型为异常->';A.,exception,functional-programming,f#,Exception,Functional Programming,F#,我正在将一个类从C#改编为F#,在代码中我有一个抛出异常的方法,这个方法需要有一个泛型返回。在C#到F#中,它工作正常,但从F#到F#会发生编译错误:FS0193此表达式是函数值,即缺少参数。其类型为Exception->'a member this.Throw() = try raise ... with | exc -> ... Unchecke

我正在将一个类从C#改编为F#,在代码中我有一个抛出异常的方法,这个方法需要有一个泛型返回。在C#到F#中,它工作正常,但从F#到F#会发生编译错误:FS0193此表达式是函数值,即缺少参数。其类型为Exception->'a

        member this.Throw() =
            try
               raise ...
            with
            | exc -> ...
            Unchecked.defaultof<'T> // <- Error
成员this.Throw()=
尝试
提高。。。
具有
|exc->。。。

Unchecked.defaultof问题是您翻译了C#
throw就像升高一样,但这是不正确的。如果要重新引发当前异常,需要使用
reraise()
函数:

member this.Throw() =
    try
        raise this.SourceException
    with
    | exc ->
        let newStackTrace = _stackTrace + 
            ExceptionDispatchInfo.BuildStackTrace(Environment.StackTrace)
        ExceptionDispatchInfo.SetStackTrace(this.SourceException, newStackTrace)
        reraise()

原始代码中发生的情况是
Throw()
方法不返回值,而是返回
raise
函数的值,该函数引发给定的异常。这在语法上是有效的,但类型与您预期的不同。

问题是您翻译了C#
throw就像升高一样,但这是不正确的。如果要重新引发当前异常,需要使用
reraise()
函数:

member this.Throw() =
    try
        raise this.SourceException
    with
    | exc ->
        let newStackTrace = _stackTrace + 
            ExceptionDispatchInfo.BuildStackTrace(Environment.StackTrace)
        ExceptionDispatchInfo.SetStackTrace(this.SourceException, newStackTrace)
        reraise()

原始代码中发生的情况是
Throw()
方法不返回值,而是返回
raise
函数的值,该函数引发给定的异常。这在语法上是有效的,但类型与您预期的不同。

我无法重现您的问题,也无法找出您想要实现的目标。你能添加更多的信息吗,比如原始的(或最小的)C#代码?我无法重现你的问题,也无法找出你想要实现的目标。您能添加更多信息吗,例如原始(或最小)C#代码?