Exception F#:当使用签名文件实现异常时,如何满足IStructuralEquatable要求?

Exception F#:当使用签名文件实现异常时,如何满足IStructuralEquatable要求?,exception,compiler-errors,f#,Exception,Compiler Errors,F#,我遇到如下编译器错误: 签名和实现中类型'的类型定义不兼容,因为签名要求该类型支持接口System.Collections.IsStructuralEquatable,但该接口尚未实现 我把范围缩小到异常的记录类型包含函数类型的字段这一事实 在我的实际代码中,我可以解决这个问题,因为我在异常中不需要这个函数,但我仍然很好奇,为什么只有当我有一个签名文件时才会出现这个错误,我如何让我的异常实现IsstructuralEquatable 这是我的签名文件,Test.fsi: 模块测试 类型异常\u类

我遇到如下编译器错误:

签名和实现中类型
'
的类型定义不兼容,因为签名要求该类型支持接口
System.Collections.IsStructuralEquatable
,但该接口尚未实现

我把范围缩小到异常的记录类型包含函数类型的字段这一事实

在我的实际代码中,我可以解决这个问题,因为我在异常中不需要这个函数,但我仍然很好奇,为什么只有当我有一个签名文件时才会出现这个错误,我如何让我的异常实现
IsstructuralEquatable

这是我的签名文件,
Test.fsi

模块测试
类型异常\u类型
异常测试异常类型的异常
val抛出测试异常:单位->单位
这是我的实现文件,
Test.fs

模块测试
类型异常\u类型={value:unit->unit}
异常测试异常类型的异常
让我们抛出测试异常():unit=
设r={value=(fun()->())}
升起(测试仪异常r)

当没有签名文件时,一切都可以正常编译。

要使签名生效,您需要在签名中定义完整类型的异常类型:

test.fsi

module Test
type exception_type = { value: unit -> unit }
...
然后错误就会消失

签名文件是。您可以创建它们


我不知道为什么要在异常中传递函数。这对我来说没有意义,但如果您详细说明您的情况(在另一个问题中),也许我可以提供一些建议。

要使您的签名生效,您需要在签名中定义例外类型的完整类型:

test.fsi

module Test
type exception_type = { value: unit -> unit }
...
然后错误就会消失

签名文件是。您可以创建它们


我不知道为什么要在异常中传递函数。这对我来说没有意义,但如果你详细说明你的情况(在另一个问题中),也许我可以提供一些建议。

我不知道答案,因为我从未使用过签名文件。我只是想指出,我从来没有听说过F#社区有人使用签名文件,所以如果可能的话,我会避免使用它们。这是一个很难接受的答案,不是吗?签名文件对于隐藏实现非常有用。如果我说,“我从未在C#中使用过接口,我会避免使用它们”-这有意义吗?这不是一个答案,只是一个注释。即使你个人觉得它们有用,你也会因为使用它们而体验到与F#culture的摩擦,这会带来实际的负面影响,没有多少人能够帮助你。这是值得考虑的。强烈地说,签名文件似乎被非正式地弃用了。我找不到任何关于签名文件被非正式弃用的来源/讨论。因为我在这里没有得到任何关于如何使我的确切场景工作的回应,所以我认为这是一个bug或F#中缺少的特性。我不知道答案,因为我从未使用过签名文件。我只是想指出,我从来没有听说过F#社区有人使用签名文件,所以如果可能的话,我会避免使用它们。这是一个很难接受的答案,不是吗?签名文件对于隐藏实现非常有用。如果我说,“我从未在C#中使用过接口,我会避免使用它们”-这有意义吗?这不是一个答案,只是一个注释。即使你个人觉得它们有用,你也会因为使用它们而体验到与F#culture的摩擦,这会带来实际的负面影响,没有多少人能够帮助你。这是值得考虑的。强烈地说,签名文件似乎被非正式地弃用了。我找不到任何关于签名文件被非正式弃用的来源/讨论。因为我在这里没有得到任何关于如何使我的确切场景工作的回应,所以我认为这是一个bug或F#中缺少的特性。正如我在问题中所说,我实际上不需要在异常中传递函数。我创建了一个异常,作为构造函数参数,我让它接受模块的主记录类型。它碰巧有一个函数值字段。我通过反复试验确定是那个特定字段导致了编译错误。至于你的建议,关键是签名文件中的异常类型是抽象的。如果你把它具体化,你就改变了我问题的前提之一。抽象类型是我首先倾向于使用签名文件的原因之一!最后,是的,我确实在F#文档中看到了这一点,但没有在.NET核心问题的上下文中使用它。我刚刚生成了它-生成的签名文件不会使任何类型变得抽象,因此这也没有帮助:(正如我在问题中所说,我实际上不需要在异常中传递函数。我创建了一个异常,其中,作为构造函数参数,我让它采用模块的主记录类型。它碰巧有一个函数值字段。我通过反复试验确定是那个特定字段导致了编译错误。至于yo你的建议,关键是签名文件中的异常类型是抽象的。如果你把它具体化,你会改变我问题的一个前提。抽象类型是我首先倾向于使用签名文件的原因之一!最后,是的,我在F#文档中看到了这一点,但没有在上下文中如何使用它NET核心问题的xt。我刚刚生成了它-生成的签名文件不会使任何类型变得抽象,因此这也没有帮助:(