Option<T>
This type represents an optional value.
Instances of Option<T> encapsulates the value as a container and only allow access through the Match e Match2 methods.
Option values are considered in IsNone state when the encapsulated value are equals to null or equals to its default.
Properties
Name
Type
Description
IsSome
bool
Returns true when the value is not null and is not equals to its default value. Otherwise, returns false.
IsNone
bool
Returns true when the value is null or equals to its default value. Otherwise, returns false.
Constructors
Parameters
Returns
Description
T value
Option<T>
Initialize a new instance of Option<T>
Methods
Name
Parameters
Returns
Description
Some
T value
Option<T>
Creates Some<T> if the parameter is not null or equals to its default value. Otherwise creates None.
None
Option<T>
Creates Option<T> with IsNone state.
Match
Func<T, TResult> methodWhenSome
Func<TResult> methodWhenNone
TResult
This allows a sophisticated way to apply some method for Option<T> values without having to check for the existence of a value.
Match2
Option<T2> option2
Func<T, T2, TResult> methodWhenSome
Func<TResult> methodWhenNone
TResult
This allows a sophisticated way to apply some method for two different Option<T> values without having to check for the existence of a value.
Match
Action<T> actionWhenSome
Action actionWhenNone
void
This allows a sophisticated way to apply some method for Option<T> values without having to check for the existence of a value.
Match2
Option<T2> option2
Action<T, T2> actionWhenSome
Action actionWhenNone
void
This allows a sophisticated way to apply some method for two different Option<T> values without having to check for the existence of a value.
Operators Overload
Operator
Parameters
Description
Implicit Cast
T value
Creates Some<T> if the parameter is not null or equals to its default value. Otherwise creates None.
Usage
You can use an Option value in so many different ways.
Creating an option value
You can use the constructor to create option values in IsSome or IsNone states, according its parameter.
Constructors
Option<int> valueWithSome = new Option<int>(10); //-> IsSome
Option<int> valueWithNone = new Option<int>(0); //-> IsNoneYou can also use the static methods Some or None to define the desired state of the value. The Some method can be little tricky because it there's no guarantees that the created value will be at IsSome state, because it depends on the value passed as parameter.
Some and None methods
Option<int> valueWithSome = Option<int>.Some(10); //-> IsSome
Option<int> valueWithNone = Option<int>.Some(0); //-> IsNone
Option<int> value2WithNone = Option<int>.None(); //-> IsNoneFinally the simplest version: implict cast. Because of this feature you don't need to worry about any kind of syntax, you just create the value as regular types.
Implicit cast
Option<int> valueWithSome = 10; //-> IsSome
Option<int> valueWithNone = 0; //-> IsNoneThrough this implicit cast you can creates new option values by using regular return commands.
See:
private Option<string> GetTextIfEven(int value)
{
if (value % 2 == 0)
return "Even";
else
return null;
}In a more functional way:
private Option<string> GetTextIfEven(int value)
=> value % 2 == 0 ?
"Even"
: null;Realize the fact that the method returns just a regular string or null values, without creates an Option value.
This method works fine, but is more elegant to use the None method of Option class instead of null.
private Option<string> GetTextIfEven(int value)
=> value % 2 == 0 ?
"Even"
: Option<string>.None();Getting value from an option
To get the value encapsulated by an Option<T> method is necessary uses Match or Match2 methods. There aren't other way to get this value, so, you need to treat both cases properly.
The Match method receive two different functions as parameters, one for each case: Some and None state.
Match with named parameters
Option<int> optionalValue = 10;
int value = optionalValue.Match(
methodWhenSome: number => number,
methodWhenNone: () => 0);The first method is executed when the value IsSome, because of it, this method receive an T value as parameter (int in this example).
The second method is executed when the value IsNone, because of it, there's no parameter in this method.
These two functions are just regular parameters, so, you can omit the its names.
Match
Option<int> optionalValue = 10;
int value = optionalValue.Match(
number => number,
() => 0);
//value = 10Besides that, you can also apply some transformation in value before got it, like square the value:
Option<int> optionalValue = 10;
int value = optionalValue.Match(
number => number * number,
() => 0);
//value = 100You can also returns any value in IsNone state, in the previous examples were used the zero value, but it isn't obrigatory.
Sometimes is necessary compare more than one Option values, this type provides the Match2 method to compare two different values instead of just one.
Match2
Option<int> optionalValue = 10;
Option<int> optionalValue2 = 15;
int value = optionalValue.Match2(
optionalValue2,
(number1, number2) => number1 + number2,
() => 2);
//value = 25In the previous sample a sum of two different Option value was made. In this particular case, both Option was in IsSome state, so the first method was executed:
(number1, number2) => number1 + number2
In this anonymous method the number1 parameter received the value from optinalValue (10) and number2 from optionalValue2(15), resulting 25.
The second method is executed when any Option value is in IsNone state.
Match2
Option<int> optionalValue = 10;
Option<int> optionalValue2 = Option<int>.None();
int value = optionalValue.Match2(
optionalValue2,
(number1, number2) => number1 + number2,
() => 2);
// value = 2There's an overload of Match and Match2 methods to receive an Action as parameter instead of a Func.
The fundamentals about Option values can be find in Fundamentals > Option Values section.
Last updated
Was this helpful?