Параметры ref и byref <> в членах класса F # - PullRequest
1 голос
/ 19 сентября 2019

Я переписал некоторые свои определения функций f # в статические члены и застрял в ошибке параметра ref / byref:

static member bar (a : byref<int>) = Foo.bar &a 

Error   FS0001  This expression was expected to have type
    'int ref'    
but here has type
    'byref<'a>' 

Есть ли различия в параметрах byref между определениями let и static?

UPD:

Это работающий пример того, что я изменил определение статического члена:

> let rec foo (a :byref<int>) = 
    a <- a-1
    if a > 0 then
        System.Console.Write(a.ToString()); foo &a
    else a
;;
val foo : a:byref<int> -> int

> let mutable a = 3;; 
val mutable a : int = 3

> foo &a;;
21val it : int = 0

Теперь это выглядит так, и это не работает.Почему?:

> type Foo() =
    static member bar (a : byref<int>) = 
        a <- a-1
        if a > 0 then
            System.Console.Write(a.ToString()); foo &a
        else a;;
type Foo =
  class
    new : unit -> Foo
    static member bar : a:byref<int> -> int
  end   

> let mutable b = 3;;
val mutable b : int = 3

> Foo.bar &b;;

  Foo.bar &b;;
  --------^^

stdin(71,9): error FS0001: This expression was expected to have type
    'int ref'    
but here has type
    'byref<'a>'    

1 Ответ

2 голосов
/ 20 сентября 2019

int ref - это определение типа F # Ссылочная ячейка , тогда как byref<'a> является эквивалентом аргументов C # ref / out (аргумент, передаваемый по ссылке, даже если это тип значения).

Невозможно сказать что-либо более без воспроизводимого фрагмента, но вполне возможно, что вы смешали два типа:

let myFunc(a: int ref) = a := 1

// this is wrong
let a = 1
myFunc &a

// this is right
let a = ref 1
myFunc a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...