【问题标题】:Can't write CLI-Compatible Extension Methods in F#无法在 F# 中编写与 CLI 兼容的扩展方法
【发布时间】:2018-12-06 09:03:58
【问题描述】:

我有以下 F# 代码,我试图用它来编写 C# 的扩展方法。我在 .NET Core 2.2 (macOS) 上使用 F# 4.5,而 C# 7.3 尝试调用扩展方法。

open System
open System.Runtime.CompilerServices

[<assembly: Extension>]
do ()

[<Extension>]
module Extensions =
    [<CompiledName("Print"); Extension>]
    type System.String with
        [<Extension>]
        static member inline Print(str : System.String) = Console.WriteLine(str)

    [<CompiledName("Blorp"); Extension>]
        type System.Object with
            [<Extension>]
            static member inline Blorp(o : System.Object) = Console.WriteLine("Blorp")

这主要取自 F# 4.1 规范,其程序集属性抄袭自 here。我正在使用 JetBrains Rider,并且它所在的命名空间扩展被正确导入,并且方法调用甚至在调用它们的 C# 函数体中正确突出显示,显示它们的类型。但是当我运行 dotnet 时,我得到两个扩展的 CS1061 构建错误,说实例不包含任何一种方法的定义,也没有找到扩展方法。用 C# 和 VB.NET 编写的相同方法可以正常工作。我究竟做错了什么?是否不再可能在 F# 中编写与 CLI 兼容的扩展方法?

【问题讨论】:

  • 省略inline 关键字是否有效?如果没有,当您删除type […] with 行并将您的扩展方法声明为let-bound 函数时它是否有效?
  • 是的,当扩展方法是 let-bound 函数时它可以工作。太感谢了!我在任何地方都找不到它们的语法。

标签: c# .net f# clr extension-methods


【解决方案1】:

评论中的@dumetrulo 在这里有解决方案。扩展方法需要是模块中的 let-bound 函数,没有封闭类型声明:

namespace Extensions

open System
open System.Runtime.CompilerServices

[<Extension>]
module Extensions =
    [<Extension>]
    let Print(str : System.String) = Console.WriteLine(str)

    [<Extension>]
    let Blorp(o : System.Object) = Console.WriteLine("Hello World from an F# Extension Method!")

此外,[&lt;assembly: Extension&gt;] 属性似乎是不必要的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2014-10-15
    相关资源
    最近更新 更多