为什么F#不支持嵌套类?

Dan*_*iel 17 f#

F#不支持嵌套类技术,风格,任意的原因吗?

浏览Reflector中的BCL,嵌套类用于枚举器,DynamicMetaObjects和其他一些东西.

这激起了我对F#没有这个功能的好奇心.我知道还有其他方法可以做同样的事情.我很好奇.

Tom*_*cek 20

我想嵌套类不是.NET对象模型的核心功能,它只是为了节省资源而被删除.可能存在一些技术难题(即具有可见性或具有递归类型定义),但我认为这不是一个主要问题.

对于许多在C#中使用嵌套类的情况,例如迭代器,你可以很好地使用对象表达式,所以我猜它们在某些方面替代了嵌套类:

type Collection() =
  member x.GetEnumerator() = 
    let n = ref 0
    { new IEnumerator with
        member x.Current = box n.Value
        member x.MoveNext() = incr n; true
        member x.Reset() = n := 0 }
Run Code Online (Sandbox Code Playgroud)

虽然这与嵌套类非常相似,但它不会编译为嵌套类,并且对象表达式的主体无法访问其私有成员Collection.我想支持这会使表达式的编译有点复杂化,因为对象表达式可能出现在类上下文之外......

实际上,private虽然代码仍未编译为嵌套类,但可以从对象表达式访问成员.请参阅评论了解详情

  • @Tomas:实际上,根据F#规范,"_all_非公共实体的CLI编译形式是内部的"....这就是为什么不应该给非F#客户端提供[<InternalsVisibleToAttribute>]特权......他们会在F#程序集中看到_private_的所有内容为_internal_! (4认同)