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

时间:2012-01-20 21:51:51

标签: f#

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

在Reflector中浏览BCL,嵌套类用于枚举器,DynamicMetaObject,以及其他一些东西。

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

2 个答案:

答案 0 :(得分:19)

我认为嵌套类不是.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 }

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

实际上,可以从对象表达式访问private成员,尽管代码仍未编译为嵌套类。有关详细信息,请参阅注释。

答案 1 :(得分:2)

F#主要基于Caml,它没有嵌套类。

可能没有添加它只是因为它不是非常高优先级。由于您可以声明在模块外部不可见的数据类型,因此允许内部类不会对代码的良好封装程度产生太大的影响。