Dynamic-typing has its place, sure. If you're writing a small script to generate a webpage, or do simple text and file processing, or operation on simple types and don't really care how it's represented. But that flexibility comes at a cost in the long run, of readability, maintainability, stability, and efficiency.
For a project as large as a game engine, a Dynamic Typed language is not the way to go, because the scope just gets too large and there may be interactions that span pages and pages of code and classes so keeping checks and balances on what type of data you're dealing with is good for your sanity. As well, the overhead of dynamic typing just makes me shudder.. seems really unnecessary for something like this when everything can be easily defined ahead of time.
If you're writing proper organized C++ code you don't /need/ to cast types all over the place, and if you really need to use the same function with different inputs then you could always just overload it.
As for casting between variable types I'm pretty sure for both C++ and Java the only time the cast is explicit is when there is possibility of a loss in information (downcasting) which makes sense because it is important to be aware of it since it could change your results. Casting between classes is something I almost never do.
I don't know about how ASP.NET handles NULL but in C++ and Java NULL there is one NULL and if you try to reference it you get an error because that is not allowed; NULL is not empty string and so I don't think it should be treated as such.
Errors are good. It lets you know what to fix.