Why does C# need so much manual casting...