Cautious With Implicit Cast Operators in Structs
I find overloading operators a very powerful tool in a programmer’s arsenal, yet it seems a very rare practice among C# developers. I’ve just got bitten by a simple scenario where an explicit cast operator is a questionable idea.
In my code I have an IriRef
class. It’s basically a string or Uri wrapped in a structure, which adds semantics required
by my library JsonLd.Entities to properly serialize objects to JSON-LD. Here’s a excerpt, with
other stuff removed.
1 2 3 4 5 6 7 8 |
|
As you see it can be constructed from string
and Uri
instances. However I don’t want to call these constructors every
time so I added two cast operators.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
See the difference? Uri
can be casted implicitly so
1 2 3 4 5 |
|
I didn’t want two implicit
operator, because while ear Uri will be a valid IriRef
the same cannot be said about
simple string. Casting a string to IriRef
must be a conscious decision and the compiler will help a little.
Here’s how this decision bit me
The problem arose when I first used a Nullable<IriRef>
. The problem is that the implicit cast automatically converts
null values into into an IriRef
, which means that IriRef?
will never be null.
1 2 3 4 |
|
Very interesting lesson indeed :)