f# - 难以从 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 解决方案,它说明了这个问题。
解决方案
因此,当您在不同的模块中定义扩展时,它将成为可选类型扩展
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
推荐阅读
- amazon-s3 - Kafka S3 源连接器
- python - 我的 on_message 功能不再起作用
- elasticsearch - Elasticsearch 未在云 URL 中打开
- php - 如何在docker容器中访问主机的mongo db
- python - 将 pandas df 转换为嵌套字典
- angular - 使用角度重定向问题的 Microsoft 多因素身份验证
- javascript - 如何通过特定索引获取未来的项目和过去的项目,比如在轮播中
- javascript - 尝试解决 N Rook 问题时遇到问题。总是得到 n*n 解而不是 N 阶乘
- html - 在不同的缩放级别上保持 css 右箭头的大小相同
- mysql - 续集插入级联