diff --git a/Source/FunicularSwitch/FunicularSwitch.csproj b/Source/FunicularSwitch/FunicularSwitch.csproj
index 7af2840..7858bd3 100644
--- a/Source/FunicularSwitch/FunicularSwitch.csproj
+++ b/Source/FunicularSwitch/FunicularSwitch.csproj
@@ -14,7 +14,7 @@
6
- 4.0
+ 4.1
$(MajorVersion).0.0
diff --git a/Source/FunicularSwitch/Option.cs b/Source/FunicularSwitch/Option.cs
index ea4813d..78cfdfc 100644
--- a/Source/FunicularSwitch/Option.cs
+++ b/Source/FunicularSwitch/Option.cs
@@ -128,9 +128,12 @@ public T GetValueOrThrow(string? errorMessage = null) =>
: throw new InvalidOperationException(errorMessage ?? "Cannot access value of none option");
public Option Convert() =>
- Match(s => Option.Some((TOther)(object)s!), Option.None);
+ Match(s => Option.Some((TOther)(object)s!), Option.None);
- public override string ToString() => Match(v => v?.ToString() ?? "", () => $"None {typeof(T).BeautifulName()}");
+ public Option As() where TTarget : class =>
+ Bind(item => (item as TTarget).ToOption());
+
+ public override string ToString() => Match(v => v?.ToString() ?? "", () => $"None {typeof(T).BeautifulName()}");
public bool Equals(Option other) =>
_isSome == other._isSome && EqualityComparer.Default.Equals(_value, other._value);
diff --git a/Source/Tests/FunicularSwitch.Test/OptionSpecs.cs b/Source/Tests/FunicularSwitch.Test/OptionSpecs.cs
index ff69b50..6d27b87 100644
--- a/Source/Tests/FunicularSwitch.Test/OptionSpecs.cs
+++ b/Source/Tests/FunicularSwitch.Test/OptionSpecs.cs
@@ -595,6 +595,20 @@ public void As_DoesNotMatch_None()
asList.Should().BeNone();
}
+ [TestMethod]
+ public void AsConvertOptionValue()
+ {
+ var value = new MyDerived();
+ var myBaseOption = Some(value);
+ myBaseOption.As().Should().BeSome().Which.Should().Be(value);
+ myBaseOption.As().Should().BeSome().Which.Should().Be(value);
+ myBaseOption.As().Should().BeNone();
+ }
+
+ class MyBase;
+ class MyDerived : MyBase;
+ class AnotherClass;
+
[TestMethod]
public async Task Match_TaskOptionT_FuncTTout_FuncTOut_Some_Matched()
{