委托/功能转换和误导的编译器错误消息

阿卡什

我以为F#函数和System.Func之间的转换必须手动完成,但似乎在某些情况下编译器(有时)会为您执行此操作。当出现错误时,错误消息也不准确:

module Foo =
    let dict = new System.Collections.Generic.Dictionary<string, System.Func<obj,obj>>()

    let f (x:obj) = x

    do
        // Question 1: why does this compile without explicit type conversion?
        dict.["foo"] <- fun (x:obj) -> x 
        // Question 2: given that the above line compiles, why does this fail?
        dict.["bar"] <- f 

最后一行无法编译,错误是:

This expression was expected to have type
    System.Func<obj,obj>    
but here has type
    'a -> obj

显然,该函数f没有的签名'a > obj如果F#3.1编译器对第一个字典分配感到满意,那么为什么不对第二个字典分配满意呢?

v

规范中应对此进行解释的部分是8.13.7成员调用时的类型定向转换简而言之,当调用成员时,将应用从F#函数到委托的自动转换。不幸的是,规格还不清楚。从措辞上看,这种转换似乎可以适用于任何函数表达式,但实际上,它似乎仅适用于匿名函数表达式。

规范也有点过时了。在F#3.0中,类型定向转换还允许转换为System.Linq.Expressions.Expression<SomeDelegateType>

编辑

在查看过去与F#团队的往来信件时,我想我已经跟踪了如何将转换应用于非语法功能表达式。为了完整起见,这里将其包括在内,但这是一个奇怪的特殊情况,因此对于大多数目的,您可能应该考虑以下规则:仅语法函数将应用类型定向转换。

例外是重载解析会导致转换函数类型的任意表达式;14.4节“方法应用程序解析”部分对此进行了部分解释,尽管它非常密集并且仍然不十分清楚。基本上,仅当有多个重载时才对参数表达式进行详细说明当只有一个候选方法时,将针对未详细说明的参数声明参数类型(请注意:就转换是否适用而言,这实际上并不重要,但凭经验而言确实重要)。这是一个演示此异常的示例:

type T =
    static member M(i:int) = "first overload"
    static member M(f:System.Func<int,int>) = "second overload"

let f i = i + 1

T.M f |> printfn "%s" 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将类模板转换为 SFINAE 和构造函数委托,现在我收到编译器错误

来自分类Dev

NUnit测试中的Lambda和委托类型:编译器错误

来自分类Dev

编译器错误消息定制

来自分类Dev

确保模板功能的编译器错误

来自分类Dev

是否是试图编译此代码的错误导致IDE终止或编译器无法运行?

来自分类Dev

指针,转换和不同的编译器

来自分类Dev

Java编译器和接口转换

来自分类Dev

C,编译器错误和指针

来自分类Dev

operator []编译器错误和警告

来自分类Dev

VSCode,Paket和编译器错误

来自分类Dev

Lambda和强制转换交集类型(Eclipse编译器错误)

来自分类Dev

将'this'指针从项转换为const项和编译器错误

来自分类Dev

将'this'指针从项转换为const项和编译器错误

来自分类Dev

仅使用Unix编译器的错误消息

来自分类Dev

编译器错误消息:CS1513

来自分类Dev

仅使用Unix编译器的错误消息

来自分类Dev

编译器错误消息:CS0009-mscorlib.dll

来自分类Dev

编译器错误消息:CS1513:} 预期 if 的瀑布

来自分类Dev

编译器和编译器

来自分类Dev

C ++程序编译器错误:无匹配功能

来自分类Dev

C ++:来自DLL的编译器错误覆盖功能

来自分类Dev

使用动态参数调用通用扩展方法时,C#编译器失败并产生误导性错误

来自分类Dev

Java导入程序包将无法正常工作[编译器会引发误导性错误]

来自分类Dev

解析编译器语法和错误的错误恢复

来自分类Dev

泛型和迭代器的Java编译器错误

来自分类Dev

什么是 ?和@符号表明此编译器错误?-Visual Studio 2013编译器

来自分类Dev

什么是 ?和@符号表明此编译器错误?-Visual Studio 2013编译器

来自分类Dev

编译器从int转换时,long和double是相同的

来自分类Dev

编译器的信号和错误之间的区别(SBCL 1.2.4)

Related 相关文章

  1. 1

    将类模板转换为 SFINAE 和构造函数委托,现在我收到编译器错误

  2. 2

    NUnit测试中的Lambda和委托类型:编译器错误

  3. 3

    编译器错误消息定制

  4. 4

    确保模板功能的编译器错误

  5. 5

    是否是试图编译此代码的错误导致IDE终止或编译器无法运行?

  6. 6

    指针,转换和不同的编译器

  7. 7

    Java编译器和接口转换

  8. 8

    C,编译器错误和指针

  9. 9

    operator []编译器错误和警告

  10. 10

    VSCode,Paket和编译器错误

  11. 11

    Lambda和强制转换交集类型(Eclipse编译器错误)

  12. 12

    将'this'指针从项转换为const项和编译器错误

  13. 13

    将'this'指针从项转换为const项和编译器错误

  14. 14

    仅使用Unix编译器的错误消息

  15. 15

    编译器错误消息:CS1513

  16. 16

    仅使用Unix编译器的错误消息

  17. 17

    编译器错误消息:CS0009-mscorlib.dll

  18. 18

    编译器错误消息:CS1513:} 预期 if 的瀑布

  19. 19

    编译器和编译器

  20. 20

    C ++程序编译器错误:无匹配功能

  21. 21

    C ++:来自DLL的编译器错误覆盖功能

  22. 22

    使用动态参数调用通用扩展方法时,C#编译器失败并产生误导性错误

  23. 23

    Java导入程序包将无法正常工作[编译器会引发误导性错误]

  24. 24

    解析编译器语法和错误的错误恢复

  25. 25

    泛型和迭代器的Java编译器错误

  26. 26

    什么是 ?和@符号表明此编译器错误?-Visual Studio 2013编译器

  27. 27

    什么是 ?和@符号表明此编译器错误?-Visual Studio 2013编译器

  28. 28

    编译器从int转换时,long和double是相同的

  29. 29

    编译器的信号和错误之间的区别(SBCL 1.2.4)

热门标签

归档