Не могу написать CLI-совместимые методы расширения в F # - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть следующий код F #, который я пытаюсь использовать для написания методов расширения для C #.Я использую F # 4.5 в .NET Core 2.2 (macOS), при этом 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, а атрибут сборки взят из здесь .Я использую JetBrains Rider и расширения пространства имён, под которым он импортирован должным образом, и вызовы методов даже выделяются должным образом в теле функции C #, где они вызываются, показывая их тип.Но когда я запускаю dotnet, я получаю ошибку сборки CS1061 для обоих расширений, говоря, что экземпляры не содержат определения ни для одного из методов, и методы расширения не найдены.Те же методы, написанные на C # и VB.NET работают нормально.Что я делаю неправильно?Больше нельзя писать CLI-совместимые методы расширения в F #?

1 Ответ

0 голосов
/ 06 декабря 2018

@ dumetrulo в комментарии было решение здесь.Методы расширения должны быть привязанными к функциям функций в модуле, без объявления типа включения:

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>] представляется ненужным

...