这4行编译但对我没有意义:
open System
type mclas (y) =
member x.m = x.m
let z = mclas (1:>obj)
问题:在什么情况下我们需要以这种方式编码?我是否激活了我不知道的微妙的类功能?
编辑:如果没有用例,这段代码有关编译器警告/错误的状态是什么,是否有资格在github上发布一些问题?
注意:在运行时,调试器无法评估变量z说"功能评估超时"。
答案 0 :(得分:1)
成员m实际上在IL中编译成这样的东西:
.property instance object m {
.get instance object Program/mclas::get_m()
}
所以m是一个object类型的属性,它有一个无穷无尽的getter。与此相当的C#是:
public class mclas
{
public mclas(object y) { }
public object x {
get {
return x;
}
}
}
因为递归永远不会结束,花费太长时间和/或当调试器试图评估m时发生StackOverflowException,它会取消并吐出评估超时。
对于你的实际问题:我不认为你在F#中需要这种自我引用,至少我想不出任何可能的用法。
我认为编译器的这种行为是有道理的,因为没有参数的成员总是会编译为只获取属性,然后这将是定义无限递归属性的最明显的方法(因为它没有使用并不意味着你不能这样做。)