首页 > 解决方案 > 难以从 C# 中看到“内在类型扩展”

问题描述

Microsoft F# 文档说...

内部类型扩展必须在与它们扩展的类型相同的文件和相同的命名空间或模块中定义。任何其他定义都将导致它们成为可选的类型扩展。

当我在 SAME 命名空间和 SAME 文件中定义扩展但 DIFFERENT 模块时,我不能使用 C# 中的扩展:

namespace Contacts

module AddressBookTypes =

    type Person = { FirstName: string; LastName: string }

module AddressBookFunctions =

    open AddressBookTypes

    let fullName (p: Person) = p.FirstName + " " + p.LastName

type Person with
    member public me.FullName = me |> fullName // Not visible in C#

let getFullName1 (p: Person) = p.FullName // Visible locally

文档是否正确?还是必须在同一个模块中定义内在扩展?这是Github 上一个非常简单的 VS 解决方案,它说明了这个问题。

标签: f#

解决方案


因此,当您在不同的模块中定义扩展时,它将成为可选类型扩展

C# 或 Visual Basic 使用者也看不到可选的扩展成员。它们只能在其他 F# 代码中使用。

如果您希望在 C# 代码中使用不同模块中定义的扩展,您应该使用扩展方法

open System.Runtime.CompilerServices
open Contacts.AddressBookTypes
open Contacts.AddressBookFunctions

[<Extension>]
type PersonExtensions =
    [<Extension>]
    static member FullName(person: Person) = fullName person

推荐阅读