非常无类型和递归的类定义,编译但似乎是我的一个角落案例

时间:2015-02-10 14:47:49

标签: f#

这4行编译但对我没有意义:

open System

type mclas (y) =
    member x.m = x.m

let z = mclas (1:>obj)

问题:在什么情况下我们需要以这种方式编码?我是否激活了我不知道的微妙的类功能?

编辑:如果没有用例,这段代码有关编译器警告/错误的状态是什么,是否有资格在github上发布一些问题?

注意:在运行时,调试器无法评估变量z说"功能评估超时"。

1 个答案:

答案 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#中需要这种自我引用,至少我想不出任何可能的用法。

我认为编译器的这种行为是有道理的,因为没有参数的成员总是会编译为只获取属性,然后这将是定义无限递归属性的最明显的方法(因为它没有使用并不意味着你不能这样做。)