C#/.NET has had support for the Tuple class (a reference type) since .NET 4, but with C# 7 tuples now gets some “syntactic sugar” (and a new ValueTuple struct) to make them part of the language.
Previous to C# 7 we’d write code like this
var tuple = new Tuple<string, int>("Four", 4); var firstItem = tuple.Item1;
Now, in a style more like F#, we can write the following
var tuple = ("Four", 4); var firstItem = tuple.Item1;
This code makes the creation of tuples slightly simpler but we can also make the use of the “items” within a tuple more readable by using names. So we could rewrite the above in a number of ways, examples of each supplied below
(string name, int number) tuple1 = ("Four", 4); var tuple2 = (name: "Four", number: 4); var (name, number) = ("Four", 4); var firstItem1 = tuple1.name; var firstItem2 = tuple2.name; var firstItem3 = name;
Whilst not quite as nice as F# we also now have something similar to pattern matching on tuples, so for example we might be interested in creating a switch statement based upon the numeric (second item) in the above code, we can write
switch (tuple) { case var t when t.number == 4: Console.WriteLine("Found 4"); break; }
Again, similar to F# we also can discard items/params using the underscore _, for example
var (_, number) = CreateTuple();
In this example we assume the CreateTuple returns a tuple type with two items. The first is simply ignored (or discarded).