非常无类型和递归的 class 编译定义,但对我来说似乎是一个极端情况
Very untyped and recursive class definition that compiles but seems a corner case to me
这 4 行编译但对我来说没有意义:
open System
type mclas (y) =
member x.m = x.m
let z = mclas (1:>obj)
问题: 什么情况下需要这样写?我是否激活了我不知道的细微 class 功能?
Edit :如果没有用例,这段代码关于编译器 warning/error 的状态是什么,它是否有资格在 github ?
注意 :在运行时,调试器无法评估变量 z 说 "Function evaluation timed out".
成员 m 实际上在 IL 中编译成这样的东西:
.property instance object m {
.get instance object Program/mclas::get_m()
}
所以 m 是一个 属性 类型的对象,它有一个 getter 无限递归。这在 C# 中的等价物是:
public class mclas
{
public mclas(object y) { }
public object x {
get {
return x;
}
}
}
因为递归永远不会结束,花费的时间太长and/or 当调试器尝试计算 m 时发生 WhosebugException,它取消并吐出计算超时。
对于您的实际问题:我认为您在 F# 中不需要这种自引用,至少我想不出任何可能的用途。
我认为编译器的这种行为是有道理的,因为没有参数的成员将始终编译为 get-only 属性,然后这将是定义无限递归的最明显方式 属性(没用不代表你不能做)
这 4 行编译但对我来说没有意义:
open System
type mclas (y) =
member x.m = x.m
let z = mclas (1:>obj)
问题: 什么情况下需要这样写?我是否激活了我不知道的细微 class 功能?
Edit :如果没有用例,这段代码关于编译器 warning/error 的状态是什么,它是否有资格在 github ?
注意 :在运行时,调试器无法评估变量 z 说 "Function evaluation timed out".
成员 m 实际上在 IL 中编译成这样的东西:
.property instance object m {
.get instance object Program/mclas::get_m()
}
所以 m 是一个 属性 类型的对象,它有一个 getter 无限递归。这在 C# 中的等价物是:
public class mclas
{
public mclas(object y) { }
public object x {
get {
return x;
}
}
}
因为递归永远不会结束,花费的时间太长and/or 当调试器尝试计算 m 时发生 WhosebugException,它取消并吐出计算超时。
对于您的实际问题:我认为您在 F# 中不需要这种自引用,至少我想不出任何可能的用途。
我认为编译器的这种行为是有道理的,因为没有参数的成员将始终编译为 get-only 属性,然后这将是定义无限递归的最明显方式 属性(没用不代表你不能做)