F# 在函数结果中使用关键字时引发System.ObjectDisposedException

F# 在函数结果中使用关键字时引发System.ObjectDisposedException,f#,F#,例如,hashAlgorithm返回SHA1。 当通过TestOhash执行时,上升System.ObjectDisposedException let hashAlgorithm : HashAlgorithm = ConfigurationManager.AppSettings.Item("HashAlgorithm") |> CryptoConfig.CreateFromName :?> HashAlgorithm let bytesToHash (b

例如,hashAlgorithm返回SHA1。 当通过TestOhash执行时,上升System.ObjectDisposedException

let hashAlgorithm : HashAlgorithm =
    ConfigurationManager.AppSettings.Item("HashAlgorithm")
        |> CryptoConfig.CreateFromName :?> HashAlgorithm

let bytesToHash (bytes : byte[]) =
    bytes |>
        use hash = hashAlgorithm
        hash.ComputeHash
如果我换成

use hash = SHA1.Create()
那么一切都很好


如何通过TestOhash
更改函数以使用使用关键字?

问题可能在于
使用
块的范围。试一试

let bytesToHash (bytes:byte[]) =
    use hash = hashAlgorithm
    bytes |> hash.ComputeHash
这将在调用
ComputeHash
后处理
hash
值并返回值。在代码中,
hash
是在创建一个函数值包装
ComputeHash
之后,但在实际使用字节数组调用它之前处理的

另一个问题是,您只创建一次哈希算法,但可能会多次处理它,因此我预计除了第一次调用
bytestToHash
之外,所有调用都会失败。您可以这样解决此问题:

let hashAlgorithm() : HashAlgorithm = ...

let bytesToHash (bytes:byte[]) =
    use hash = hashAlgorithm()
    bytes |> hash.ComputeHash