Skip to content

Commit 6ca796c

Browse files
authored
Merge pull request #1386 from eiriktsarpalis/csharp-optional-param-compat
[WIP] Implement implicit converter for F# optionals
2 parents 7cfe41e + a840e8c commit 6ca796c

File tree

11 files changed

+41
-4
lines changed

11 files changed

+41
-4
lines changed

src/fsharp/FSharp.Core.Unittests/SurfaceArea.net20.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1977,6 +1977,7 @@ Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1+Ta
19771977
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] None
19781978
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] Some(T)
19791979
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] get_None()
1980+
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] op_Implicit(T)
19801981
Microsoft.FSharp.Core.FSharpOption`1[T]: System.String ToString()
19811982
Microsoft.FSharp.Core.FSharpOption`1[T]: System.Type GetType()
19821983
Microsoft.FSharp.Core.FSharpOption`1[T]: T Value

src/fsharp/FSharp.Core.Unittests/SurfaceArea.net40.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2138,6 +2138,7 @@ Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1+Ta
21382138
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] None
21392139
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] Some(T)
21402140
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] get_None()
2141+
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] op_Implicit(T)
21412142
Microsoft.FSharp.Core.FSharpOption`1[T]: System.String ToString()
21422143
Microsoft.FSharp.Core.FSharpOption`1[T]: System.Type GetType()
21432144
Microsoft.FSharp.Core.FSharpOption`1[T]: T Value

src/fsharp/FSharp.Core.Unittests/SurfaceArea.portable259.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2114,6 +2114,7 @@ Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1+Ta
21142114
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] None
21152115
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] Some(T)
21162116
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] get_None()
2117+
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] op_Implicit(T)
21172118
Microsoft.FSharp.Core.FSharpOption`1[T]: System.String ToString()
21182119
Microsoft.FSharp.Core.FSharpOption`1[T]: System.Type GetType()
21192120
Microsoft.FSharp.Core.FSharpOption`1[T]: T Value

src/fsharp/FSharp.Core.Unittests/SurfaceArea.portable47.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2111,6 +2111,7 @@ Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1+Ta
21112111
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] None
21122112
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] Some(T)
21132113
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] get_None()
2114+
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] op_Implicit(T)
21142115
Microsoft.FSharp.Core.FSharpOption`1[T]: System.String ToString()
21152116
Microsoft.FSharp.Core.FSharpOption`1[T]: System.Type GetType()
21162117
Microsoft.FSharp.Core.FSharpOption`1[T]: T Value

src/fsharp/FSharp.Core.Unittests/SurfaceArea.portable7.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2127,6 +2127,7 @@ Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1+Ta
21272127
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] None
21282128
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] Some(T)
21292129
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] get_None()
2130+
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] op_Implicit(T)
21302131
Microsoft.FSharp.Core.FSharpOption`1[T]: System.String ToString()
21312132
Microsoft.FSharp.Core.FSharpOption`1[T]: System.Type GetType()
21322133
Microsoft.FSharp.Core.FSharpOption`1[T]: T Value

src/fsharp/FSharp.Core.Unittests/SurfaceArea.portable78.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2114,6 +2114,7 @@ Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1+Ta
21142114
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] None
21152115
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] Some(T)
21162116
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] get_None()
2117+
Microsoft.FSharp.Core.FSharpOption`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] op_Implicit(T)
21172118
Microsoft.FSharp.Core.FSharpOption`1[T]: System.String ToString()
21182119
Microsoft.FSharp.Core.FSharpOption`1[T]: System.Type GetType()
21192120
Microsoft.FSharp.Core.FSharpOption`1[T]: T Value

src/fsharp/FSharp.Core/prim-types.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3462,6 +3462,8 @@ namespace Microsoft.FSharp.Core
34623462

34633463
static member Some(x) : 'T option = Some(x)
34643464

3465+
static member op_Implicit(x) : 'T option = Some(x)
3466+
34653467
override x.ToString() =
34663468
// x is non-null, hence Some
34673469
"Some("^anyToStringShowingNull x.Value^")"

src/fsharp/FSharp.Core/prim-types.fsi

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1740,6 +1740,11 @@ namespace Microsoft.FSharp.Core
17401740
/// <returns>An option representing the value.</returns>
17411741
static member Some : value:'T -> 'T option
17421742

1743+
/// <summary>Implicitly converts a value into an optional that is a 'Some' value.</summary>
1744+
/// <param name="value">The input value</param>
1745+
/// <returns>An option representing the value.</returns>
1746+
static member op_Implicit : value:'T -> 'T option
1747+
17431748
[<CompilationRepresentation(CompilationRepresentationFlags.Instance)>]
17441749
/// <summary>Get the value of a 'Some' option. A NullReferenceException is raised if the option is 'None'.</summary>
17451750
member Value : 'T

tests/fsharp/core/fsfromfsviacs/lib.fs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,15 @@ let tup3 = (2,3,4)
4242
let tup4 = (2,3,4,5)
4343

4444

45+
type OptionalParameterTests =
46+
static member MethodWithOptionalParams<'T>(?value1 : 'T, ?value2 : int) = (value1, value2)
4547

48+
static member FSharpMethodThatConsumesOptionalParams() =
49+
let _ = OptionalParameterTests.MethodWithOptionalParams<int>()
50+
let _ = OptionalParameterTests.MethodWithOptionalParams<int>(42)
51+
let _ = OptionalParameterTests.MethodWithOptionalParams<int>(value2 = 42)
52+
let _ = OptionalParameterTests.MethodWithOptionalParams<int>(42, ?value2 = None)
53+
()
4654

4755

4856
module StructUnionsTests =
@@ -111,6 +119,4 @@ module NestedStructUnionsTests =
111119
let testPattern3mut(u2:U2) =
112120
let mutable u2 = u2
113121
match u2 with
114-
| U2(U1(dt1,"a"),U1(dt2,"b")) -> (dt1 = dt2)
115-
116-
122+
| U2(U1(dt1,"a"),U1(dt2,"b")) -> (dt1 = dt2)

tests/fsharp/core/fsfromfsviacs/lib2.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using Microsoft.FSharp;
23
using Microsoft.FSharp.Core;
34
using Microsoft.FSharp.Collections;
@@ -60,3 +61,20 @@ public static void SomeMethod() { }
6061

6162
}
6263
}
64+
65+
namespace FSharpOptionalTests
66+
{
67+
public class ApiWrapper
68+
{
69+
public static Tuple<FSharpOption<T>, FSharpOption<int>> MethodWithOptionalParams<T>(T value1, int value2)
70+
{
71+
return Lib.OptionalParameterTests.MethodWithOptionalParams<T>(value1 = value1, value2 = value2);
72+
}
73+
74+
public static int MethodThatImplicitlyConvertsFSharpOption(int x)
75+
{
76+
FSharpOption<int> opt = x;
77+
return opt.Value;
78+
}
79+
}
80+
}

0 commit comments

Comments
 (0)