It has been long since I wrote a post in Evil Code series. So here is a short one, using the Tuples which was introduced in C# 7.X.
“introduced in C# 7.x” . You must be wondering why I used that phrase. Tuples was there before 7.x right ? Well, the answer is both yes and no. Tuples did exist before 7.x, but the one introduced in 7.x isn’t exactly the same. This newer version is a struct called
System.ValueTuple and are noticeably different from its predecesoor in following ways.
System.ValueTupleis a struct, while
System.Tupleis a reference type.
System.ValueTupleis mutable, while
System.ValueTupleexposes items via Fields, while
System.Tupleexposes items via properties.
You might have already seen a thousand articles on Tuples and have used them in your code base. So I would not go into further details on semantics and usages, but we will explore a special case.
Consider the following code.
var tuple1 = (Item1:1,Item2:2); var tuple2 = (1,2); var tuple3 = (Item2:2,Item1:1);
What would be the output of above code ?
Well, it would not even compile. The last would throw an error.
CS8125 Tuple element name 'Item2' is only allowed at position 2. CS8125 Tuple element name 'Item1' is only allowed at position 1.
Why is it so ? Tuples can be broadly categorized in two ways – tuple literal and tuple types.
Tuple literals has a value and an optional name, while tuple typeshave type and optional name. In both cases, the name is optional and could be anything, except when the naming pattern uses the ItemN syntax.
These are reserved names which the tuple reserves for unnamed Tuple. You could use them as well, however, you are not allowed to alter the order.
Every element in the tuple could be accessed by the name if present, or its position. For acessing the Tuple element with position, .Net uses the naming convension
ItemN where N is the position in the Tuple (1 based index).
The first element in the Tuple has to be Item1, the second Item2 and so on. If you alter the naming convention and use Item2 as the first element, the compiler would complain as shown above.
If you are attempting to name the first element as Item2, you are basically creating an ambiguity (should use the word confusion). This is why the naming convension prohibits such a pattern.
That was a rather a simple one right ? But that is the thing I like about the Evil Code series. Most of them are quite simple, but somewhere in the details, there are hidden facts which one as a developer needs to be aware of.