我试图用byref参数覆盖方法,下面的代码是一个例子
type Incrementor(z) =
abstract member Increment : int byref * int byref -> unit
default this.Increment(i : int byref,j : int byref) =
i <- i + z
type Decrementor(z) =
inherit Incrementor(z)
override this.Increment(i : int byref,j : int byref) =
base.Increment(ref i,ref j)
i <- i - z
但是编译器给了我这个错误:
A type instantiation involves a byref type. This is not permitted by the rules of Common IL.
我不明白是什么问题
我猜这与CLI规范(ECMA-335)第II.9.4节有关,该节规定不能使用byref
参数实例化泛型类型。
但是泛型类型实例化在哪里?再次猜测,我认为这可能与抽象Increment
方法的签名有关,其中包含int byref * int byref
元组。但是,我不希望在调用方法时创建元组。
实际问题似乎只由base.Increment(ref i, ref j)
调用触发,如果您删除此调用,则它会编译。如果您删除其中一个byref参数,例如abstract member Increment : int byref -> unit
,它也会编译。
您可以使用显式ref
类型代替,但从您的示例中不清楚您正在尝试做什么。
type Incrementor(z) =
abstract member Increment : int ref * int ref -> unit
default this.Increment(i: int ref, j: int ref) =
i := !i + z
type Decrementor(z) =
inherit Incrementor(z)
override this.Increment(i: int ref, j: int ref) =
base.Increment(i, j)
i := !i - z