MSDN 的类型扩展页面中的以下位是相关的(强调我的):
有两种形式的类型扩展,它们的语法和行为略有不同。内在扩展是与被扩展类型出现在同一命名空间或模块、同一源文件和同一程序集(DLL 或可执行文件)中的扩展。可选扩展是出现在被扩展类型的原始模块、命名空间或程序集之外的扩展。当通过反射检查类型时,类型上会出现内在扩展,但可选扩展不会。可选扩展必须在模块中,并且仅当包含扩展的模块打开时它们才在范围内。
可选扩展的目的很明确。它可以帮助您向不属于您的程序集的类型注入新功能。例如,FSharpx 使用它来创建各种帮助器来解析原始类型:
open System
type Boolean with
static member parse x =
match bool.TryParse(x) with
| true,v -> Some v
| _ -> None
那你为什么需要内在扩展呢?答案是它的便利性。我发现将类型定义分解为具有明确目的的多个部分很有用。
在许多 F# 库中,我看到了以下模式的使用:类型定义 -> 实用函数 -> 内部扩展。通过这种方式,您可以在您的类型上定义复杂的实用函数,使它们在模块中可用,并且仍然可以直接在您的成员定义中使用它们。您可以查看 F# PowerPack 中的Complex 类型以查看模式。
编辑:
老实说,我经常交替使用类型扩展和类型扩充。重要的是它们是内在的还是可选的。