无法在 F# 中编写与 CLI 兼容的扩展方法
Can't write CLI-Compatible Extension Methods in F#
我有以下 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 兼容的扩展方法?
评论中的@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!")
此外,[<assembly: Extension>]
属性似乎是不必要的
我有以下 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 兼容的扩展方法?
评论中的@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!")
此外,[<assembly: Extension>]
属性似乎是不必要的