Anyone else hate this?
Doofer doofer = GetWidget(widgetId) as Doofer;
Then, somewhere miles away from this innocuous little line, I find that my doofer is unexpectedly null. This is a great way to introduce hard-to-trace bugs, unless of course it’s complimented with guard clauses everywhere to test for nulls, which most of the time means unneccesary clutter.
What’s wrong with good old…
Doofer doofer = (Doofer)GetWidget(widgetId);
In this second case, if the result of GetWidget() canâ€™t be turned into a Doofer, Iâ€™ll get an exception thrown right there and then. Assuming that my code here works specifically on doofers, I may as well spit out an exception right up here – how the heck am I supposed to work with this other type of widget you’ve sent me?
I think the only time to use a soft ‘as’ cast is in the tiny minority of cases where you really donâ€™t care if the result of GetWidget can be turned into a Doofer. It seems to me that 90% of the time, you really do care, and youâ€™d like to know as soon as itâ€™s not. Even in that 10%, you’d probably be better off using a null object.
It’s a shame, because the ‘as’ operator is a bit more readable, and we all hate having to slam all those brackets in everywhere. Fortunately, C# provides a little-known solution to this, known as implicit casting.