I suggest we ...

Expand support for byref to match C# 7

C# is adding support for byref locals and returns (see https://github.com/dotnet/roslyn/issues/118, slated for milestone 1.3). This will result in many libraries that expose these features (which the CLR already supports), but methods with such return types aren't currently usable from F#. F# already supports byref locals, but doesn't support implementing byref-returning methods nor does it support calling byref-returning methods.

At a minimum, F# should support calling byref-returning-methods (e.g. SomeRefReturningMethod(x,y,z) <- w), since C# users will be creating methods like these and being unable to call them will limit F#'s reach.

It would be nice if on top of that base level of support F# also supported declaring such methods, using the same safety rules that C# is using (e.g. the only refs that are safe to return are those that point to values stored on the heap or existing refs that are passed into the method).

14 votes
Vote
Sign in
Check!
(thinking…)
Reset
or sign in with
  • facebook
  • google
    Password icon
    Signed in as (Sign out)
    You have left! (?) (thinking…)
    Keith Battocchi shared this idea  ·   ·  Flag idea as inappropriate…  ·  Admin →

    2 comments

    Sign in
    Check!
    (thinking…)
    Reset
    or sign in with
    • facebook
    • google
      Password icon
      Signed in as (Sign out)
      Submitting...
      • Keith Battocchi commented  ·   ·  Flag as inappropriate

        Concretely, this code works today:

        let array = [| 1 .. 10 |]
        let r = &array.[0]
        r <- -1

        But if you create a method using ildasm that wraps int[]'s Address method (with signature int[] * int -> int&), then this doesn't

        let arr = [| 1 .. 10 |]
        let r = ArrayHelper.GetAddress(arr, 0) // error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL.
        r <- -1

      F# Language

      Feedback and Knowledge Base