And that's just a start. I'm told that you don't need that much practice to get really productive with Haskell, while enjoying just about all kinds of safety that a language could provide.
In the case of M#, I believe that they want to add contract based programming to the core language to provide extra safety. That would mean that you can choose to use those features at those places where you think safety is very important, and choose to let them fly where productivity matters more.
You also must define "idiomatic Python" or "idiomatic C#" first. I would recommend, that you first write your post and than commence with the discussion.
yes, it means "type safety", i.e. strong typing.
Including the compile-time safety net that c#, python, Java et all have over c - you never pass a value typed as "void * *"; and that they have over over JavaScript - your code never gets an untyped object that you just have to hope has the expected methods or properties.
> though you can end up in the same situation with "optimistic downcasting" (eg, get an Object as parameter
You can, though it doesn't happen much in practice. The complexity of the type systems (generics, interfaces, etc) are aimed in part at always allowing there to be a strong type.
If you need hope, you're doing dynamic languages wrong.
I have no idea how you can merge safety and productivity. People may be very productive in JavaScript, but I think "safety" means a bit more than "remember to use === and always have a reference handy because there are weird quirks in function X and Y".