-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This represents a first attempt at how I plan to explain discriminated unions to our customers.
- Loading branch information
1 parent
318bfca
commit 38d6c94
Showing
1 changed file
with
23 additions
and
0 deletions.
There are no files selected for viewing
23 changes: 23 additions & 0 deletions
23
meetings/working-groups/discriminated-unions/conceptual-overview.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
# Conceptual overview | ||
|
||
> The text that follows is the working draft for how we'll introduce this concept to customers. It's meant to address two distinct challenges: | ||
> | ||
> - Many of the scenarios for unions can also be handled by inheritance. That prompts the question on the value of adding unions to C#. | ||
> | ||
> - Unions have different meanings in different computer languages. There are tagged unions, type unions, C-style (unsafe) unions. Which do we mean? | ||
> | ||
> The language is intended to be less formal than the specification and serve as an introduction for customers. | ||
*Discriminated unions* provide a new way to express the concept that *an expression may be one of many known types*. | ||
|
||
C# already provides syntax for special cases of discriminated unions. Nullable types express one example: A `int?` is either an `int`, or nothing. A `string?` is either a `string` value or nothing. Another example is `enum` types. An `enum` type represents a closed set of values. The expression is limited to one of those values. | ||
|
||
## Closed set of possibilities | ||
|
||
The `enum` example highlights one limitation in C# now: An `enum` is represented by an underlying integral type. The compiler issues a warning if an invalid integral value is assigned to a variable of an `enum` type. But, that's the limit of the enforcement. Therefore, when you use an `enum` type in a `switch` expression, you must also check for invalid values using a discard (`_`) pattern. | ||
|
||
C# developers often use *inheritance* to express that an expression is *one of many types*. You declare that an expression is of a base class, and it could be any class derived from that type. Inheritance differs from union types in two ways. Most importantly, a union represents one of a *known* set of types. An inheritance hierarchy likely includes derived classes beyond the known set of derived types. Secondly, a union doesn't require an inheritance relationship. A union can represent *one of many known `struct` types*, or even a union of some `struct` types and some `class` types. Inheritance and unions have some overlap in expressiveness, but both have unique features as well. | ||
|
||
## On to examples | ||
|
||
Add examples based on our existing design. |