F#不支持嵌套类技术,风格,任意吗?
在Reflector中浏览BCL,嵌套类用于枚举器,DynamicMetaObject
,以及其他一些东西。
这激起了我对F#没有这个功能的好奇心。我知道还有其他方法可以做同样的事情。我很好奇。
答案 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,它没有嵌套类。
可能没有添加它只是因为它不是非常高优先级。由于您可以声明在模块外部不可见的数据类型,因此允许内部类不会对代码的良好封装程度产生太大的影响。